javascript问题: Object == String 吗?
发布于 3年前 作者 diyuxinlang 1828 次浏览

我是一个ruby程序员。最近看到node.js挺火的,也就试试了。 因为没怎么写过javascript,写起来挺不顺手的。 所以就想把ruby里一些好用的函数(如:empty)拿到javascript里来用。 我的代码是这样写的。

String.prototype.empty = function(){
    console.log(typeof(this));
    return this=='' ? true : false;
}


console.log('hello'.empty());
console.log('——————');
console.log(''.empty());


结果:

object
false
——————
object
true

结果看来说应该 是对了吧!但为什么typeof(this)是object呢?

String.prototype.empty = function(){
    console.log(this);
    console.log(typeof(this));
    return this=='' ? true : false;
}


console.log('hello'.empty());
console.log('——————');
console.log(''.empty());


结果:
{ '0': 'h', '1': 'e', '2': 'l', '3': 'l', '4': 'o' }
object
false
——————
{}
object
true

从上面的结果来看,为什么 typeof(this) 是 object 的原因是明白了。 但问题又出现了:

为什么 this==’’ 判断式没有出问题,而且每次还能得出正确的结果呢? 难到说 object 和 string 类型是等价的?

望哪位大侠给指点迷津啊!

4 回复

判断使用 ‘===’ 更靠谱一点。

在Chrome上试了一下:

typeof String(‘hello’) 的结果为 string

typeof new String(‘hello’) 的结果为 object

这里其实有两个概念:

String type     javascript 内置 类型之一
String Object  javascript 内置对象之一,继承自Object的

平时声明:

var str0 = "abc";  //  String type
var str1 = String('abc')  // String Type
var str2 = new String('abc')  //String Object

这可以在ECMAScript文档里找到,可以解释@leizongmin 的测试结果

当调用 String.prototype.empty 方法的时候,脚本引擎应该是对String type 做了转换,因为作为一个内建类型(注意区别内建对象),它并没有原型链,原文解释:

The String type is the set of all finite ordered sequences of zero or more 16-bit unsigned integer values (―elements‖)

所以应该是当 "hello".empty() 的时候,引擎将 “hello” 变成了 new String(“hello”); 这样就好解释为什么LZ的console.log 打印的都是typeof 都是object了,因为那个this的的确确就是一个 String Object。

当你对string进行.xxx()操作的时候 已经把string变成了obj String.prototype就是string obj的原型 而已经脱离了string

==判断的时候 可以对不同的type 比较的是表面值 所以new String(“”) == ""成立 但是new String(“”) === ""就不成立了

回到顶部