首页 > 解决方案 > javascript - 字符串对象实例在浏览器和 nodejs 中表现出不同的行为

问题描述

这不是现实生活中的场景。我正在尝试更多地了解 js 中的字符串,并遇到了以下问题:

var name = new String('sann');

console.log('type of name=' ,typeof name); 
// returns object in nodejs but string in browser
console.log('name instanceof String' ,name instanceof String) 
// returns true in nodejs but false in browser

NodeJS 的输出符合我的预期,浏览器的输出让我很困惑。
这种行为差异的原因是什么?

标签: javascriptnode.jsstring

解决方案


两者都是对的。

规范说(强调我的):

String 构造函数是 %String% 内在对象和全局对象的 String 属性的初始值。当作为构造函数调用时,它会创建并初始化一个新的 String 对象。当 String 作为函数而不是构造函数调用时,它会执行类型转换。

所以new String(value)返回一个字符串对象而不是一个原语。

无论如何,在浏览器中,全局window对象有一个名为 的属性name,它的设置器会自动将提供的值转换为字符串。

相同的片段,如果包装到函数调用中,报告name为 type object,如预期的那样。

(() =>
{
    var name = new String('sann');

    console.log('type of name', typeof name);
    console.log('name instanceof String', name instanceof String);
}
)();

在 Node.js 中,全局对象没有该属性,因此name被视为普通值。


推荐阅读