null 和 undefined
Undefined相当于一个变量并没有明确的被赋值(是否被赋值, 可能无心忽略, 逻辑问题) JS的怪异之处就在于undefined真的是一个可以使用的值。
> var foo; > foo undefined
同理,当缺失参数时 JavaScript 会分配一个 undefined:
> function id(x) { return x } > id() undefined a = 1; a !== undefined // true a = undefined var b a === b //true
Null相当于变量被明确指定了没有值,而不是由于意外的原因被忽略掉了(赋值null, 正当逻辑)
参与运算
JS的null如果进入运算,真的会被解析成为0或false:
(1 + null) # 1 (1 * null) # 0 (1 * null) # Infinity
undefined进入运算,一律得到NaN:
(1 + undefined) # NaN (1 * undefined) # NaN (1 / undefined) # NaN
逻辑判断
null和undefined逻辑判断时都认为是false。
只用一个判断,就可以同时检验这两项是否为真:
//也会把 false, -0, +0, NaN 与 '' 当成“空值” if (v) { // v 有值 } else { // v 没有值 }
但是如果碰到大坑==的时候
var foo; console.log(foo == null); // true console.log(foo == undefined); // true console.log(foo === null); // false console.log(foo === undefined); // true console.log(null == undefined); // true
好的做法, 一律使用===
判断一个量已定义且非空,只使用:if (a !== null && a !== undefined)。
=== 和 ==
1.==用来判断两个值是否相等
当两个值类型不同时,会发生自动转换,得到的结果非常不符合直觉,这可能不是你想要的结果。
"" == "0" // false 0 == "" // true 0 == "0" // true false == "false" // false false == "0" // true false == undefined // false false == null // false null == undefined // true " \t\r\n" == 0 // true
2.===
类型+值比较
"如果两边的操作数具有相同的类型和值,===返回true,!==返回false。"——《JavaScript:语言精粹》
最佳实践:
任何时候在比较操作中使用 === 和 !==
json操作
var person = {name :'Saad', age : 26, department : {ID : 15, name : "R&D"} }; var stringFromPerson = JSON.stringify(person); /* stringFromPerson is equal to "{"name":"Saad","age":26,"department":{"ID":15,"name":"R&D"}}" */ var personFromString = JSON.parse(stringFromPerson); /* personFromString is equal to person object */ to string var obj = { name: 'myObj' }; JSON.stringify(obj);
var slice_func = [].slice //slice_func() var a = function() { }; // a() var a = { fun : function() { }; } // a.fun() someElement.addEventListener("click", function(e) { // I'm anonymous! });
以及
var f = function foo(){ return typeof foo; // foo是在内部作用域内有效 }; // foo在外部用于是不可见的 typeof foo; // "undefined" f(); // "function"
匿名函数
from var name = 'Chris'; var age = '34'; var status = 'single'; function createMember(){ // [...] } function getMemberDetails(){ // [...] } to var myApplication = function(){ var name = 'Chris'; var age = '34'; var status = 'single'; return{ createMember:function(){ // [...] }, getMemberDetails:function(){ // [...] } } }(); // myApplication.createMember() and // myApplication.getMemberDetails() now works.
最佳实践
1.定义多个变量时,省略var关键字,用逗号代替
var someItem = 'some string'; var anotherItem = 'another string'; var oneMoreItem = 'one more string';
更好的做法
var someItem = 'some string', anotherItem = 'another string', oneMoreItem = 'one more string';
2.谨记,不要省略分号, 不要省略花括号
省略分号,可能导致更大的,未知的,难以发现的问题
var someItem = 'some string' function doSomething() { return 'something' }
更好的做法
var someItem = 'some string'; function doSomething() { return 'something'; }
3.使用{}代替 new Ojbect()
在JavaScript中创建对象的方法有多种。可能是传统的方法是使用”new”加构造函数,像下面这样:
var o = new Object(); o.name = 'Jeffrey'; o.lastName = 'Way'; o.someFunction = function() { console.log(this.name); }
更好的做法
var o = {}; //空对象
var o = { name: 'Jeffrey', lastName = 'Way', someFunction : function() { console.log(this.name); } };只要把多个全局变量都整理在一个名称空间下,拟将显著降低与其他应用程序、组件或类库之间产生糟糕的相互影响的可能性。——Douglas Crockford
4.使用[]代替 new Array()
var a = new Array(); a[0] = "Joe"; a[1] = 'Plumber';
更好的做法:
var a = ['Joe','Plumber'];
5.typeof判断
typeof一般只能返回如下几个结果:number,boolean,string,function,object,undefined
expr:
typeof xx === '' typeof xx !== ''
e.g.