js基礎(chǔ)中不熟悉的點

  1. 亦或

給定一個非空整數(shù)數(shù)組减余,除了某個元素只出現(xiàn)一次以外,其余每個元素均出現(xiàn)兩次惩系。找出那個只出現(xiàn)了一次的元素位岔。

亦或:如果a,b兩個值相同則亦或為0,如果不同則亦或為1

1 ^ 1 = 0 
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
3 ^ 3 = 0 

for(let i = 1 , len = nums.length;i < len; i ++){
  nums[ 0 ] ^ = nums[ i ]  
}
return nums[0]

堡牡? 結(jié)題答案中有用map數(shù)組比我用for循環(huán)計算時間少抒抬,why?

可能是網(wǎng)絡(luò)延時!N畋2两!!

for循環(huán)的性能應(yīng)該是最好的

  1. Array: map forEach

map 和forEach都接受兩個參數(shù)芥颈,第一個參數(shù)必填是個函數(shù)惠勒,第二個參數(shù)選填,作用是改變函數(shù)中this指向

var name = 'wky'
var a = { name = "yc" }
var b = [1,3,4]
b.map(function(val,index){
    return val + this.name
}) 
// 輸出 ['1wky','3wky','4wky']

b.map(function(val,index){
    return val + this.name
},a)

//輸出 [ '1yc', '3yc','4yc' ]


// 注:箭頭函數(shù)this指向不變爬坑,仍指向父級中this指向

b.map(val =>{ return val + this.a },a)

// 輸出輸出 ['1wky','3wky','4wky']

  1. 纠屋? undefined == null true

    0 == undefined false

    ''== undefined false

    0 == null false

    '' == null false

詳見末尾寬松相等

  1. 基礎(chǔ)類型

字符串布爾類型都有方法,是因為使用對應(yīng)的變量時妇垢,編譯器會將其裝箱成對應(yīng)的對象類型巾遭,例如 var s = 'test',如果使用s變量時會將s = new String(s)進(jìn)行封裝肉康,一旦屬性引用結(jié)束闯估,這個新創(chuàng)建的對象就會被銷毀

var s = 'test';
s == new String(s)  // true
s.len = 4
s.len   // undefined
  1. arguments 和 function

    1.1 函數(shù)形參和實參
    在函數(shù)體中存在一個形參的引用,指向當(dāng)前傳入的實參列表吼和,通過它可以獲得參數(shù)的值

    1.2 函數(shù)體內(nèi)this指向
    在嚴(yán)格模式中this 指向 undefined

    1.3 arguments

    1. arguments 是指向?qū)崊ο蟮囊?/li>
    2. arguments中的數(shù)組 與形參是別名的關(guān)系
    3. 嚴(yán)格模式下 arguments是個保留字涨薪,并且不能被重新賦值
    4. 非嚴(yán)格模式下 arguments是個標(biāo)識符, 能被修改
    function test(){ 'use strict'; console.log( arguments ); arguments = 1 }
    
    // 報錯 Uncaught SyntaxError: Unexpected eval or arguments in strict mode
    
    function test(){ arguments =2; console.log( arguments ); arguments = 1 }
    
    // arguments 輸出為2
    

    1.4 閉包

    關(guān)聯(lián)到閉包的作用域鏈都是活動的炫乓,嵌套的函數(shù)不會講作用域內(nèi)的私有成員復(fù)制一份刚夺,也不會對所綁定的變量生成靜態(tài)快照献丑。

    1.5 函數(shù)屬性、方法和構(gòu)造函數(shù)

    1. 函數(shù)length和函數(shù)實際參數(shù)的length
    function check(a, b ,c){
        console.log(arguments.length); // 實際參數(shù)個數(shù)
        console.log(arguments.callee.length); // 函數(shù)期待參數(shù)個數(shù)
    }
    
    
    1. call 和 apply方法

    call 和 apply方法 第一個參數(shù)的作用是改變函數(shù)體中this的指向侠姑,第二個參數(shù)是參數(shù)创橄,可傳可不傳

        var obj = { 
            test: function(){console.log(this.a)},
            a: '10' 
        }
        var a = 20;
        obj.test.call(null); // 20
        obj.test.call(obj); // 10
        
        Object.prototype.toString.call([]) // 改變的是toString中this的指向
        
    
    

    apply 參數(shù)傳入的是個數(shù)組,但是會將數(shù)組參數(shù)和函數(shù)形參一一對應(yīng)

    function testArray(a){ console.log(a) }
    testArray.apply(null,[1,3])
    <!--輸出 1-->
    
    function test(a,b){ console.log(a);console.log(b) }
    test.apply([1,3])
    <!--輸出  1, 3-->
    

    Object.prototype.toString返回數(shù)據(jù)解析

    當(dāng)檢測Array實例時, Array.isArray 優(yōu)于 instanceof,因為Array.isArray能檢測iframes

    var iframe = document.createElement('iframe');
     document.body.appendChild(iframe);
     xArray = window.frames[window.frames.length-1].Array;
     var arr = new xArray(1,2,3); // [1,2,3]
     
     // Correctly checking for Array
     Array.isArray(arr);  // true
     // Considered harmful, because doesn't work though iframes
     arr instanceof Array; // false
    
    1. 第一個參數(shù)改變函數(shù)內(nèi)部this指向的函數(shù)還有Array類中的方法:

      1. forEach
      2. filter
      3. findIndex
      4. find
      5. map

      reduce 如果在空數(shù)組上調(diào)用reduce必須給一個默認(rèn)值不然就會報錯

     const array = [];
     const reducer = (c, a) => c + a ;
     array.reduce(reducer)
     <!--VM1172:1 Uncaught TypeError: Reduce of empty array with no initial value-->
     <!--    at Array.reduce (<anonymous>)-->
     <!--    at <anonymous>:1:7-->
     <!--(anonymous) @ VM1172:1-->
     array.reduce(reducer,0)
     <!--0-->
    

    array.length 值是一個無符號32位整數(shù)

    1. bind : 第一個參數(shù)改變this指向莽红,第二個是傳入的參數(shù)
    2. 構(gòu)造函數(shù) Function構(gòu)造函數(shù)創(chuàng)建的函數(shù)并不使用詞法作用域妥畏,相反,函數(shù)體代碼的編譯總是會在頂層函數(shù)執(zhí)行.
    function con (){
         const local = 'local';
         return new Function ('return local');
     }
     const local = 'global';
     con()(); // global
     
     function con(){
     var scope1 = 'local';
         return function(){
             console.log( scope1 );
         }
     }
     var scope1 = 'global';
     
     con()(); // 輸出 local
    
  1. promise promise.all await async generator setTimeout

    1. setTimeout (function,delay,param)
    function test(value){ console.log(value) }
    setTimeout(test,500,10) // 500ms之后 輸出10
    // 參數(shù)是待執(zhí)行函數(shù)的參數(shù)
    
    1. Promise.resolve()

      需要將現(xiàn)有對象轉(zhuǎn)換為Promise對象

      1. 參數(shù)是一個Promise實例
        如果參數(shù)是一個Promise實例安吁,那么Promise.resolve將不做任何修改醉蚁、原封不動的返回這個實例
      2. 參數(shù)是一個thenable對象
        thenabel對象是指具有then方法的對象,例如:
      let thenable = {
          then:(resolve,reject)=>{
              return resolve(21);
          }
      }
      

      Promise.resolve()方法將這個對象轉(zhuǎn)換為Promise對象鬼店,并立即執(zhí)行then方法

      let thenable = {
          then:(resolve,reject)=>{
              return resolve(21);
          }
      }
      let p1 = Promise.resolve(thenable)
      
      1. 參數(shù)不是具有then的對象网棍,或者根本不是對象
        返回一個新的promise對象
      2. 不帶有任何參數(shù)
        直接返回一個Promise對象
    2. Promise原理(暫時還是有點懵,可能需要在看看妇智?)

    function Promise(fn){
    var state = "pending";
    var value = null;
    var callbacks = [];
    this.then = function(onFulfilled){
    
        return new Promise(function( resolve ){
            handle({
                onFulfilled: onFulfilled || null,
                resolve: resolve
            });
        })
    };
    function handle(callback){
        if( state == 'pending' ){
            callbacks.push(callback);
            return ;
        }
        if(!callback.onFulfilled){
            callback.resolve(value);
            return;
        }
        var ret = callback.onFulfilled(value);
        callback.resolve(ret);
    }
    function resolve(newValue){
        if(newValue && (typeof newValue ==='object' || typeof  newValue ==='function')){
            var then = newValue.then;
            if(typeof then ==='function'){
                then.call(newValue,resolve);
                return;
            }
        }
        state = 'fulfilled';
        value = newValue;
        setTimeout(function(){
            callbacks.forEach(function(callback){
                handle(callback);
            })
        },0);
    }
    fn(resolve);
    }
    
  2. generator 自執(zhí)行函數(shù)

function co(gen){
    var g = gen();
    var t = g.next();
    function next(res){
        console.log(res);
        if(res.done) return ;
        if(typeof g.next !='function') return;
        if(res.value instanceof Promise){
            res.value.then(value =>{
                res = g.next(value);
                next(res);
            })
        }
    }
    next(t)
};

注意: g.next(value) 這個value對應(yīng)的值是上一個yield的返回值

  1. JSON.stringify 接受三個參數(shù) (value,replace,space)

    1. replace 是函數(shù)
    JSON.stringify({name:'name',function(key,value){key // key  value // 值 }})
    
    1. replace是數(shù)組
    JSON.stringify({1:1,2:1,3:1,5:1},[1,5]) // "{ "1":1,"5":1 }"
    
  2. for of 只能遍歷存在 Symbol.iterator接口的數(shù)據(jù)結(jié)構(gòu)滥玷,對象不存在這個接口,所以只能通過手動添加這個遍歷器接口

var Obj = { name:'name',age:18 ,info:{ name:'infoName',age:'infoAge' }};
Object.defineProperty(Obj,Symbol.iterator,{
    value:function(){
        var o = this;
        var idx = 0;
        var ks = Object.keys(o);
        return {
            next:function(){
                return {
                    value: o[ks[idx++]],
                    done: idx > ks.length
                }
            }
        }
    },
    enumerabel: false,
    writable: false,
    configurable: true,
    
});
for(let value of Obj){
    console.log(value);
}
// 輸出    name  18    info:{ name:'infoName', age:'infoAge' }
  1. 原型 繼承

    1. Object.create模擬實現(xiàn)
    Object.create = function (o){
        var F = function(){};
        F.prototype = o;
        return new F();
    }
    
  2. 強(qiáng)制類型轉(zhuǎn)換

    1. JSON.stringify轉(zhuǎn)換規(guī)則(ToString)
    1. 字符串巍棱、數(shù)字罗捎、布爾值和null的轉(zhuǎn)換規(guī)則和ToString一致
    2. 如果傳遞給JSON.stringify的對象中定義了toJSON方法,那么該方法會在字符串化前調(diào)用拉盾,以便將對象轉(zhuǎn)化成安全的JSON值
    var a ={ 
        name:'wky',
        age:10,
        toJSON:function(){ 
            return this.name
            } 
    }
    JSON.stringify(a) ;// ""wky""
    
    1. ToNumber

    為了將值轉(zhuǎn)換為基本數(shù)據(jù)類型桨菜,抽象操作ToPrimitive會先檢查該值是否有valueof()方法,沒有然后在檢查是否有通toString()方法

    var a = { 
        valueOf:function(){ return '23' },
        toString:function(){ return '12' } 
    }
    
    Number(a) // 23
    
    
    1. 寬松相等

      1. 字符串和數(shù)字之間相等的比較

      字符串轉(zhuǎn)換成數(shù)字

      '42' == 42 // true Number('42') == 42
      
      
      1. 其他類型和Boolean類型的比較

      boolean類型轉(zhuǎn)換成number

      '42' == true  // false   '42' == Number(true)1
      
      1. null 與undefined對比 (相等)
      2. 對象與非對象的比較

      ToPrimative(Obj) == 字符串或者數(shù)字

      42 == [42] // true
      
      
  3. 如何判斷對象是原生的還是非原生對象

原生對象 執(zhí)行toString()方法之后函數(shù)中會出現(xiàn)'native code'函數(shù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捉偏,一起剝皮案震驚了整個濱河市倒得,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌夭禽,老刑警劉巖霞掺,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異讹躯,居然都是意外死亡菩彬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門潮梯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骗灶,“玉大人,你說我怎么就攤上這事秉馏“业” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵萝究,是天一觀的道長免都。 經(jīng)常有香客問我锉罐,道長,這世上最難降的妖魔是什么绕娘? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任脓规,我火速辦了婚禮,結(jié)果婚禮上险领,老公的妹妹穿的比我還像新娘抖拦。我一直安慰自己,他們只是感情好舷暮,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布态罪。 她就那樣靜靜地躺著,像睡著了一般下面。 火紅的嫁衣襯著肌膚如雪复颈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天沥割,我揣著相機(jī)與錄音耗啦,去河邊找鬼。 笑死机杜,一個胖子當(dāng)著我的面吹牛帜讲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播椒拗,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼似将,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蚀苛?” 一聲冷哼從身側(cè)響起在验,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎堵未,沒想到半個月后腋舌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡渗蟹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年块饺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雌芽。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡授艰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出膘怕,到底是詐尸還是另有隱情想诅,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布岛心,位于F島的核電站来破,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏忘古。R本人自食惡果不足惜徘禁,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望髓堪。 院中可真熱鬧送朱,春花似錦、人聲如沸干旁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽争群。三九已至回怜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間换薄,已是汗流浹背玉雾。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留轻要,地道東北人复旬。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像冲泥,于是被迫代替她去往敵國和親驹碍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,028評論 0 2
  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品凡恍,去做同樣的事情幸冻,實現(xiàn)同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 7,724評論 2 17
  • 單例模式 適用場景:可能會在場景中使用到對象咳焚,但只有一個實例洽损,加載時并不主動創(chuàng)建,需要時才創(chuàng)建 最常見的單例模式革半,...
    Obeing閱讀 2,056評論 1 10
  • 肯定是我太酷碑定,不然怎么寫出來的東西這么奇怪。
    幸有我來_8e8a閱讀 387評論 0 0
  • 2018-05-20· 字?jǐn)?shù) 593· 閱讀 80· 日記本 姓名:周富強(qiáng) 公司:廈門大科機(jī)械有限公司 日精進(jìn)打卡...
    ZFQ_dacf閱讀 162評論 0 0