基元是一种不同于Javascript中创建的对象的类型.来自Mozilla API文档:
var color1 = new String("green"); color1 instanceof String; // returns true var color2 = "coral"; color2 instanceof String; // returns false (color2 is not a String object)
我找不到用代码构造原始类型的任何方法,也许这是不可能的.这可能是人们使用typeof "foo" === "string"
而不是instanceof
.
记住这样的事情的一个简单方法就是问自己"我想知道什么是理智和易学"?无论答案是什么,Javascript都会做另一件事.
基元是一种不同于Javascript中创建的对象的类型.来自Mozilla API文档:
var color1 = new String("green"); color1 instanceof String; // returns true var color2 = "coral"; color2 instanceof String; // returns false (color2 is not a String object)
我找不到用代码构造原始类型的任何方法,也许这是不可能的.这可能是人们使用typeof "foo" === "string"
而不是instanceof
.
记住这样的事情的一个简单方法就是问自己"我想知道什么是理智和易学"?无论答案是什么,Javascript都会做另一件事.
我用:
function isString(s) { return typeof(s) === 'string' || s instanceof String; }
因为在JavaScript中字符串可以是文字或对象.
在JavaScript中,一切都是一个对象(或者至少可以被视为一个对象),除了基元(布尔值,空值,数字,字符串和值undefined
(以及ES6中的符号)):
console.log(typeof true); // boolean console.log(typeof 0); // number console.log(typeof ""); // string console.log(typeof undefined); // undefined console.log(typeof null); // object console.log(typeof []); // object console.log(typeof {}); // object console.log(typeof function () {}); // function
正如您所见,对象,数组和值null
都被视为对象(null
是对不存在的对象的引用).区分函数是因为它们是一种特殊类型的可调用对象.但它们仍然是物体.
在另一方面,文字true
,0
,""
而undefined
不是对象.它们是JavaScript中的原始值.然而,布尔值,数字和字符串也有构造函数Boolean
,Number
并String
分别包装它们各自的基元以提供附加功能:
console.log(typeof new Boolean(true)); // object console.log(typeof new Number(0)); // object console.log(typeof new String("")); // object
正如你可以看到当原始值内的包裹Boolean
,Number
和String
建设者,他们分别成为目标.该instanceof
操作仅适用于对象(这就是为什么它返回false
的原始值):
console.log(true instanceof Boolean); // false console.log(0 instanceof Number); // false console.log("" instanceof String); // false console.log(new Boolean(true) instanceof Boolean); // true console.log(new Number(0) instanceof Number); // true console.log(new String("") instanceof String); // true
正如您所看到的那样,typeof
并且instanceof
不足以测试值是否为布尔值,数字或字符串 - typeof
仅适用于原始布尔值,数字和字符串; 并且instanceof
不适用于原始布尔值,数字和字符串.
幸运的是,这个问题有一个简单的解决方案.默认实现toString
(即它本身定义的Object.prototype.toString
)返回[[Class]]
原始值和对象的内部属性:
function classOf(value) { return Object.prototype.toString.call(value); } console.log(classOf(true)); // [object Boolean] console.log(classOf(0)); // [object Number] console.log(classOf("")); // [object String] console.log(classOf(new Boolean(true))); // [object Boolean] console.log(classOf(new Number(0))); // [object Number] console.log(classOf(new String(""))); // [object String]
[[Class]]
值的内部属性比值更有用typeof
.我们可以使用如下Object.prototype.toString
创建我们自己的(更有用的)typeof
运算符版本:
function typeOf(value) { return Object.prototype.toString.call(value).slice(8, -1); } console.log(typeOf(true)); // Boolean console.log(typeOf(0)); // Number console.log(typeOf("")); // String console.log(typeOf(new Boolean(true))); // Boolean console.log(typeOf(new Number(0))); // Number console.log(typeOf(new String(""))); // String
希望本文有所帮助.要了解有关基元和包装对象之间差异的更多信息,请阅读以下博客文章:JavaScript基元的秘密生活
您可以使用构造函数属性:
'foo'.constructor == String // returns true true.constructor == Boolean // returns true
typeof(text) === 'string' || text instanceof String;
你可以使用它,它将适用于两种情况
var text="foo";
// typeof会起作用
String text= new String("foo");
// instanceof会起作用