不要对字符串、数字和布尔文字可以被视为具有属性的对象这一事实感到困惑(例如,true.toString()
)。当这些基元值通过尝试访问其属性而被视为对象时,JavaScript 将从基元的关联构造函数创建一个包装器对象,以便可以访问包装器对象的属性和方法。
一旦访问了属性,包装器对象就会被丢弃。这种转换允许我们编写代码,使其看起来好像原始值实际上是一个对象。说实话,当它在代码中被视为对象时,JavaScript 会将其转换为对象,以便属性访问可以工作,然后在返回值后将其转换回原始值。这里需要注意的关键是正在发生的事情,而 JavaScript 正在幕后为您做这件事。
原始值样本
这里有一些示例来演示我正在谈论的内容:
字符串示例:sample56.html
<!DOCTYPE html><html lang="en"><body><script> // String object treated like an object. var stringObject = new String('foo'); console.log(stringObject.length); // Logs 3. console.log(stringObject['length']); // Logs 3. // String literal/primitive converted to an object when treated as an object. var stringLiteral = 'foo'; console.log(stringLiteral.length); // Logs 3. console.log(stringLiteral['length']); // Logs 3. console.log('bar'.length); // Logs 3. console.log('bar'['length']); // Logs 3. </script></body></html>
数字示例:sample57.html
<!DOCTYPE html><html lang="en"><body><script> // Number object treated like an object. var numberObject = new Number(1.10023); console.log(numberObject.toFixed()); // Logs 1. console.log(numberObject['toFixed']()); // Logs 1. // Number literal/primitive converted to an object when treated as an object. var numberLiteral = 1.10023; console.log(numberLiteral.toFixed()); // Logs 1. console.log(numberLiteral['toFixed']()); // Logs 1. console.log((1234).toString()); // Logs '1234'. console.log(1234['toString']()); // Logs '1234'. </script></body></html>
布尔示例:sample58.html
<!DOCTYPE html><html lang="en"><body><script> // Boolean object treated like an object. var booleanObject = new Boolean(0); console.log(booleanObject.toString()); // Logs 'false'. console.log(booleanObject['toString']()); // Logs 'false'. // Boolean literal/primitive converted to an object when treated as an object. var booleanLiteral = false; console.log(booleanLiteral.toString()); // Logs 'false'. console.log(booleanLiteral['toString']()); // Logs 'false'. console.log((true).toString()); // Logs 'true'. console.log(true['toString']()); // Logs 'true'. </script></body></html>
直接访问原始数字的属性(不存储在变量中)时,必须先计算该数字,然后才能将该值视为对象(例如, (1).toString();
或1..toString();
)。为什么是两个点?第一个点被视为数字小数,而不是用于访问对象属性的运算符。
您通常应该使用原始字符串、数字和布尔值
表示字符串、数字或布尔值的文字/原始值的书写速度更快,并且文字形式更简洁。
因此,您应该使用文字值。此外, typeof
运算符的准确性取决于您创建值的方式(文字与构造函数调用)。如果您创建字符串、数字或布尔对象,则 typeof
运算符会将类型报告为对象。如果您使用文字,则 typeof
运算符将返回实际值类型的字符串名称(例如,typeof 'foo' // returns 'string'
)。
我在下面的代码中演示了这一事实。
示例:sample59.html
<!DOCTYPE html><html lang="en"><body><script> // String, number, and Boolean objects. console.log(typeof new String('foo')); // Logs 'object'. console.log(typeof new Number(1)); // Logs 'object'. console.log(typeof new Boolean(true)); // Logs 'object'. // String, number, and Boolean literals/primitives. console.log(typeof 'foo'); // Logs 'string'. console.log(typeof 1); // Logs 'number'. console.log(typeof true); // Logs 'boolean'. </script></body></html>
结论
如果您的程序依赖 typeof
运算符来根据这些基本类型识别字符串、数字或布尔值,则应避免使用 String
、Number
和 Boolean
构造函数。
2、本站所有文章、图片、资源等如果未标明原创,均为收集自互联网公开资源;分享的图片、资源、视频等,出镜模特均为成年女性正常写真内容,版权归原作者所有,仅作为个人学习、研究以及欣赏!如有涉及下载请24小时内删除;
3、如果您发现本站上有侵犯您的权益的作品,请与我们取得联系,我们会及时修改、删除并致以最深的歉意。邮箱: i-hu#(#换@)foxmail.com