類型是值
的內部特徵,它定義了值的行爲
,以使其區別於其餘值。數組
一、七種內置類型:安全
二、咱們能夠用typeof
運算符來查看值的類型,它返回的是類型的字符串值
。bash
三、由於typeof null === 'object',因此檢測null值的類型須要下面這段複合條件函數
var a = null;
(!a && typeof a == "object"); // true
複製代碼
四、函數其實是object的一個"子類型"
。具體的說,函數是"可調用對象",它有一個內部屬性[[call]]
,該屬性使其能夠被調用。工具
五、函數對象的length屬性
是其聲明的參數的個數
ui
一、Javascript中的變量是沒有類型的
,只有值
纔有。變量能夠隨時持有任何類型的值。spa
二、已在做用域中聲明
但還沒有賦值
的變量,是undefined
。prototype
三、還沒有在做用域中聲明過得變量
,是undeclared
。code
var a;
typeof a // "undefined"
typeof b // "undefined" 沒有聲明仍是undefined 這主要是由於typeof的安全防範機制
複製代碼
// 這樣是安全的
if(typeof DEBUG ! == "undefined"){
console.log('xxxxx')
}
複製代碼
(function(){
function FeatureXYZ(){};
function doSomethingCool(){
var helper = (typeof FeatureXYZ !== "undefined") ? FeatureXYZ :
function(){
// default feature
}
var a = helper();
}
doSomethingCool()
})()
複製代碼
function doSomethingCool(FeatureXYZ){
var helper = FeatureXYZ || function(){}
var val = helper();
// ...
}
複製代碼
一、數組能夠容納任何類型的值,能夠是字符串
、數字
、對象
,甚至是其餘數組
。對象
二、使用delete運算符能夠將單元從數組中刪除,可是請注意,單元刪除後,數組的length屬性並不會發生變化
。
三、在建立"稀疏"數組(即含有空白或空缺單元的數組)。a[1]的值爲undefined,但這與將其顯示賦值爲undefined(a[1] = undefined)仍是有所區別。
var a = [];
a[0] = 1;
a[2] = [3];
a[1] // undefined
a.length // 3
複製代碼
四、數組經過數字進行索引
,可是他們也是對象,因此也能夠包含字符串鍵值
和屬性
(但這些並不計算在數組長度內
)。
五、若是字符串鍵值可以被強制類型轉換爲十進制數字的話
,它就會被當作數字索引來處理
var a = [];
a[0] = 1;
a['foo'] = 2;
a.length // 1
a['foobar'] //2
a.foobar //2
var a = [];
a['13'] = 42;
a.length // 14
複製代碼
六、類數組=>數組的方式
function foo(){
var arr = Array.prototype.slice.call(arguments);
arr.push('bam');
console.log(arr)
}
foo('bar','baz') // ['bar','baz','bam']
複製代碼
var arr = Array.from(arguments)
複製代碼
一、Javascript中字符串是不可變的(指字符串的成員函數不會改變其原始值
,而是建立並返回一個新的字符串
),而數組是可變的。
二、字符串沒有reverse方法,變通方法能夠先轉換爲數組而後轉換爲字符串。
var a = 'foo'
var c = a.split("").reverse().join("")
c; //"oof"
複製代碼
一、Javascript中的數字類型是基於IEEE754標準
來實現的,該標準一般也被稱爲"浮點數"。Javascript使用的是"雙精度"格式。
二、toFixed() 方法能夠指定小數部分的顯示位數
,若是指定的小數部分的顯示位數多於實際位數就用0補齊。
三、toPrecision() 方法用來指定有效數位
的顯示位數。
四、.運算符須要給與特別的注意,由於它是一個有效的數字字符
,會被優先識別爲數字字面量的一部分
,而後纔是對象屬性訪問運算符
。
// 無效語法
42.toFixed(3) // SyntaxError
// 下面的語法都有效
(42).toFixed(3) // 42.000
0.42.toFixed(3) // 0.420
42..toFixed(3) // 42.000
複製代碼
五、二進制浮點數最大的問題(全部遵循IEEE754規範的語言都是如此)就是小數的精度不許。(例如0.1+0.2===0.3 等於false的經典問題)
// 判斷兩個小數相等
function numberCloseEnoughToEqual(n1,n2){
return Math.abs(n1-n2) < Number.EPSILON;
}
var a = 0.1 + 0.2;
var b = 0.3;
numberCloseEnoughToEqual(a,b) // true
複製代碼
六、可使用Number.isInteger()來檢測一個值是不是整數。
Number.isInteger(42) // true
Number.isInteger(42.000) // true
Number.isInteger(42.3) // false
// polyfill
if(!Number.isInteger){
Number.isInteger = function(num){
return typeof num === 'number' && num % 1 == 0
}
}
複製代碼
七、a | 0 能夠將變量a中的數值轉換爲32位有符號整數,由於數位運算符|只適用於32位整數(它只關心32位之內的值,其餘的數位將被忽略)。
八、undefined類型只有一個值,即undefined
。null類型也只有一個值,即null
。他們的名稱既是類型也是值。undefined指從未賦值
,null只曾賦過值,可是目前沒有值
九、null是一個特殊關鍵字
,不是標識符
,咱們不能將其當作變量來使用和賦值。然而undefined倒是一個標識符
,能夠被看成變量來使用和賦值。
十、在非嚴格模式下,咱們能夠爲全局標識符undefined賦值
function foo(){
undefined = 2; // 很是糟糕的作法
}
foo();
function foo(){
"use strict";
undefined = 2; // TypeError
}
foo()
複製代碼
十一、咱們能夠經過void運算符
便可獲得undefined。表達式void __ 沒有返回值,所以返回結果是undefined。void並不改變表達式的結果
,只是讓表達式不返回值
。一般咱們用void 0 來得到undefined。
var a = 42;
console.log(void a,a) // undefined 42
複製代碼
十二、不是數字的數字(NaN)
數字
類型的var a = 2 / "foo"; // NaN
typeof a === 'number' // true
複製代碼
// 全局函數isNaN判斷。(可是有一個缺陷,就是當傳遞一個非數字的時候,isNaN也返回true)
var a = 2 / 'foo';
var b = 'foo';
window.isNaN(a) // true
window.isNaN(b) // true
// ES6 的Number.isNaN
if(!Number.isNaN){
Number.isNaN = function(n){
return (
typeof n === "number" &&
window.isNaN(n)
)
}
}
// 最簡單的方法,NaN是Javascript中惟一一個不等於自身的值
if(!Number.isNaN){
Number.isNaN = function(){
return n !== n;
}
}
複製代碼
1三、零值
負零
進行字符串化
會返回'0'var a = 0 / -3;
a; // -0
a.toString() // '0'
a+'' // '0'
String(a) // '0'
複製代碼
字符串
轉換爲數字
,獲得的結果是準確的。+"-0" // -0
Number("-0") // -0
JSON.parse("-0") // -0
複製代碼
function isNegZero(n){
n = Number(n);
return (n===0) && (1/n===-Infinity)
}
複製代碼
1四、ES6新加入了一個工具方法Object.is()
來判斷兩個值是否絕對相等(加入了NaN和-0的判斷)
if(!Object.is){
Object.is = function(v1,v2) {
// 判斷是否爲-0
if(v1===0 && v2===0){
return 1/v1 === 1/v2
}
//判斷是否爲NaN
if(v1!==v1){
return v2!==v2;
}
// 其餘狀況
return v1 === v2;
}
}
複製代碼