1. Javascript没有类的概念。一般使用原型链继承(prototypal inheritance)来模拟类。
2. 除了null和undefined之外的任何数据类型都能表现成Object (behave like an object),包括Number类型和Function类型。
var
n
=
42
;
function f() { alert( " foo " ); };
alert( " n is " + n.toString()); // "n is 42"
alert(f.name + " is a function " ); // "f is a function"
function f() { alert( " foo " ); };
alert( " n is " + n.toString()); // "n is 42"
alert(f.name + " is a function " ); // "f is a function"
注意,是“表现为object”,而不是“是object”。事实上,number, string和boolean是基本类型(primitives),除了这三个之外的都可以算作object,比如一个正则表达式也是一个object。 当需要访问基本类型变量的属性时,那些基本类型变量将被临时转换成object。 例如:
"
foobar
"
.big();
// is equivalent to
new String( " foobar " ).big();
. 14 .toFixed();
// is equivalent to
new Number( 3.14 ).toFixed()
// is equivalent to
new String( " foobar " ).big();
. 14 .toFixed();
// is equivalent to
new Number( 3.14 ).toFixed()
另外,不能强行给基本类型变量(number, string, boolean)加上私有属性。
var
a
=
"
mystring
"
,
b = new String( " mystring " );
Object.defineProperty( b, 'foo', { value: 42 , enumerable: false });
console.log(b.foo); // 42
Object.defineProperty( a, 'foo', { value: 42 , enumerable: false });
// TypeError: Object.defineProperty called on non-object
// trying another way:
a.foo = 42 ;
// remember, this is equivalent to:
// new Number(a).foo = 42;
// …so the 'foo' property is defined on the wrapper, not on 'a'
console.log(a.foo); // undefined
b = new String( " mystring " );
Object.defineProperty( b, 'foo', { value: 42 , enumerable: false });
console.log(b.foo); // 42
Object.defineProperty( a, 'foo', { value: 42 , enumerable: false });
// TypeError: Object.defineProperty called on non-object
// trying another way:
a.foo = 42 ;
// remember, this is equivalent to:
// new Number(a).foo = 42;
// …so the 'foo' property is defined on the wrapper, not on 'a'
console.log(a.foo); // undefined
3. 如果变量名前不加上var,那么这个变量就是全局的。
7. 变量声明会被提升到当前作用域的顶端。 例如:下述代码中,你认为调用foo函数会返回什么?
function
setGlobal() {
a = 42 ;
}
function setLocal() {
var b = 23 ;
}
setGlobal();
alert(a); // 42
setLocal();
alert(b); // ReferenceError: b is not defined
a = 42 ;
}
function setLocal() {
var b = 23 ;
}
setGlobal();
alert(a); // 42
setLocal();
alert(b); // ReferenceError: b is not defined
4. this指针是由调用函数赋予的, 而不是由被调函数自身定义的。 例如:
var
a
=
{}, b
=
{};
a.foo = 42 ;
b.foo = 18 ;
a.alertFoo = function () { alert( this .foo); };
a.alertFoo(); // 42
a.alertFoo.call(b); // 18
a.foo = 42 ;
b.foo = 18 ;
a.alertFoo = function () { alert( this .foo); };
a.alertFoo(); // 42
a.alertFoo.call(b); // 18
5. 严格的相等判断应该使用===。例如 :
0
==
false
为真, 但是
0
===
false
为假。
6. 0, undefined, null, "", NaN 都是假值 (falsy)。
这些值全都等同于false,但他们之间不能相互替换。
7. 变量声明会被提升到当前作用域的顶端。 例如:下述代码中,你认为调用foo函数会返回什么?
var
a
=
2
;
function foo() {
return a;
var a = 5 ;
}
function foo() {
return a;
var a = 5 ;
}
它将返回undefined。 上述代码等同于下述代码:
var
a
=
2
;
function foo() {
var a; // 'a' declaration is moved to top
return a;
a = 5 ;
}
function foo() {
var a; // 'a' declaration is moved to top
return a;
a = 5 ;
}
另一个例子: 下述代码中,调用函数foo后变量a的值是什么?
var
a
=
42
;
function foo() {
a = 12 ;
return a;
function a(){}
}
function foo() {
a = 12 ;
return a;
function a(){}
}
答案是42。因为foo函数中变相声明了a变量,因此a成了局部变量了。
function
foo() {
function a() {} // local 'a' is a function
a = 12 ; // local 'a' is now a number (12)
return a; // return the local 'a' (12)
}
function a() {} // local 'a' is a function
a = 12 ; // local 'a' is now a number (12)
return a; // return the local 'a' (12)
}
8. 参数在函数声明中可以省略, 例如:
function
hello(name, age) {
alert( " Hello " + name + " , you’re " + age + " years old! " );
}
hello( " Anon " , 42 ); // "hello Anon, you’re 42 years old!"
hello( " Baptiste " ); // "hello Baptiste, you’re undefined years old!"
hello( " Bulat " , 24 , 42 ); // "hello Bulat, you’re 24 years old!"
alert( " Hello " + name + " , you’re " + age + " years old! " );
}
hello( " Anon " , 42 ); // "hello Anon, you’re 42 years old!"
hello( " Baptiste " ); // "hello Baptiste, you’re undefined years old!"
hello( " Bulat " , 24 , 42 ); // "hello Bulat, you’re 24 years old!"
9. 对于字符串,使用双引号""和单引号''的效果是一样的。
10. Javascript代码可以在浏览器环境之外运行, 比如在Terminal或者HTTP服务器上。(例如 Node.js)
原文出自:
http://www.cnblogs.com/newyorker/archive/2013/01/18/2865820.html