1. 程式人生 > 實用技巧 >Web前端筆試整理10

Web前端筆試整理10

下列說法正確的是

  • 使用Object.assign(obj1, obj2)可以實現物件的淺拷貝
  • for ... in 迴圈只能遍歷物件上的可列舉屬性
  • Object。keys( ) 不可以遍歷出物件原型鏈上的屬性

ES5 引入了Object。keys方法, 成員是引數物件自身的(不含繼承的)所有可遍歷(enumerable)屬性的鍵名。
for ... in迴圈物件的所有列舉屬性(包括原型上), 然後在使用hasOwenProperty()方法來忽略繼承屬性

嚴格模式

  1. this不再強制封裝為一個物件, 若沒有指定this的話則是indefined。
  2. 給一個未宣告的變數賦值會觸發ReferenceError錯誤, 而不再自動宣告為全域性變數
  3. 給物件的不可寫屬性或只讀屬性賦值, 給不可拓展的物件新屬性賦值, 試圖刪除物件中不可刪除的屬性會丟擲TypeError錯誤, 而不再靜默失敗
  4. 物件屬性重名, 函式引數重名均為語法錯誤
  5. 無法使用以0開頭的八進位制表示數字的語法
  6. 為原始值設定屬性將丟擲TypeError錯誤
  7. 禁用with語法
  8. 禁止刪除宣告的變數
  9. 函式中arguments物件的屬性值與函式引數值不再同步改變
  10. 增加了一些保留字無法被作為變數名或形參名使用

== 比較

null == undefined
0.1 + 0.2 == 0.3
typeof NaN
typeof Function
typeof Object
typeof {}
'a' + 1
'a' - 1
Function instanceof Object
Object instanceof Function

true
false
'number'
'function
'function'
'object'
'a1'
NaN
true
true

0.1 + 0.2 是一個無線接近 0.3的值, 它不等於0.3

在JavaScript中的二進位制的浮點數0.1和0.2並不是十分精確,在他們相加的結果並非正好等於0.3,而是一個比較接近的數字 0.30000000000000004 ,所以條件判斷結果為false

嚴格模式和this指標

'use strict'
var name = 'Jay'
var person ={
    name : 'Wang',
    pro:{
        name:'Michael',
        getName:function(){
                return this.name;
        }    
    }
}
console.log(person.pro.getName());
var pepole = person.pro.getName;
console.log(pepole());

'Michael'
throw Error

person.pro呼叫了getName(), getName()裡面的this指向了personpro, 所以這裡this.name = ‘Michael’

將person.pro.getName方法賦給了pepole, 然後再全域性執行上下文中呼叫了people() 因為是在嚴格模式下執行, 所以pepole()是指向undefined, undefined又獲取name屬性, 最後導致報錯

嚴格模式不同(再記憶一次)

  • 不允許不適用var關鍵字去建立全域性變數, 丟擲ReferenceError
  • 不允許對變數使用delete操作符, 拋ReferenceError
  • 不可對物件的只讀屬性賦值, 不可對物件的不可配置屬性使用delete操作符, 不可為不可拓展的物件新增屬性, 均拋TypeError
  • 物件屬性名必須唯一
  • 函式中不可有重名引數
  • 在函式中不可有重名引數
  • 在函式內部對修改引數不會反應到arguments中
  • 淘汰arguments.callee和arguments.caller
  • 不可在if內部宣告函式
  • 拋棄with語句