我是一个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 类型是等价的?
望哪位大侠给指点迷津啊!
判断使用 ‘===’ 更靠谱一点。
在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(””) === ""就不成立了