1. 構造函數
調用構造函數實際會經歷4步
1 創建一個新對象
2 將構造函數的作用域賦值給對象(因此this就指向了這個對象)
3 執行構造函數中的代碼(為這個新對象添加屬性)
4 返回新對象
- 在構造函數內部,this指向構造函數實例化的對象(new的時候做的事)
- 當構造函數return引用值時(函數、函數聲明、對象、數組、Date…),返回引用值,若是原始值則忽略
2.包裝類
- 原始值沒有自己的方法和屬性
console.log(new Number(1))
console.log(new String(1))
console.log(new Boolean(1))
-
數字經過new Number后成為一個對象,可以為它添加屬性和方法,可以參與運算,但返回的結果是原始值
-
undefined和null不能設置屬性和方法
-
如果把new的結果保存起來,則能打印len
-
注意以下例子
var a = 1;
a.len = 5;
console.log(a.len) // undefined
// 不會報錯,一個變量點任何屬性都不會報錯
- new Number不會改變原來的原始值a
var a = 1;
var objA = new Number(a)
objA.name = 'name'
console.log(objA, a) // Number {1, name: "name"} 1
var str = 123
,str能打印length,并不是str具有其屬性,而是打印時經過了一層包裝類- 數組的length可以用于截斷或設置,empty填充
var x = 1,y = z = 0;
function add(n) {return n = n + 1;
}
y = add(x);
function add(n) {return n = n + 3
}
z = add(x);
console.log(x, y, z) // 1 4 4
- foo1、foo3能輸出12345,foo2不報錯
- ASCII碼表1 0-127 表2 128-255 1字節
- UNICODE碼哈涵蓋了ASCII碼 從第256位開始的占2字節
function compute(str) {var sum = 0for (var i = 0; i < str.length; i++) {let temp = str.charCodeAt(i)sum += temp <= 255 ? 1 : 2}return sum
}
console.log(compute('ab黃')) // 4
- 優化:減少循環次數