他们的意思很可能是,任何可以分配给变量的数据都具有可以以类似方式访问的属性(以及因此方法)。
// strings
"asdf".length; // 4
"asdf".replace('f', 'zxc'); // "azxc"
// numbers
(10).toFixed(2); // "10.00"
// booleans
true.someProp; // undefined (point is it doesn't crash)
他们甚至有继承自的原型。
"omg".constructor; // function String() { [native code] }
String.prototype.snazzify = function() {
return "*!*!*" + this + "*!*!*";
};
"omg".snazzify(); // "*!*!*omg*!*!*"
然而,这些都是原语,虽然它们在很多方面表现得像对象,但它们在一些方面与其他“真实”JS 对象不同。其中最大的一点是它们是不可变的。
var s = "qwerty";
s.foo; // undefined, but does not crash
s.foo = 'some val'; // try to add a property to the string
s.foo; // still undefined, you cannot modify a primitive
请注意,函数是真正的可变对象。
var fn = function(){};
fn.foo; // undefined
fn.foo = 'some val'; // try to add a property to the function
fn.foo; // "some val"
因此,虽然“JS 中的一切都是对象”在技术上并不正确,但在大多数情况下,您可以将它们视为对象,因为它们具有属性和方法,并且可以潜在地扩展。请确保您了解警告。