资讯专栏INFORMATION COLUMN

原生JS大揭秘—数据类型

luck / 1611人阅读

摘要:中九个内置对象在规范中定义了六种数据类型其中原始值类型有种,引用类型有种一有包装对象数值型,包括整形和浮点型其中都是类型二有包装对象字符串类型,有两种表示方式,双引号单引号。方法可以将任意类型数据转成字符串。

JS中九个内置对象

在ECMAScript规范(ES5)中定义了六种数据类型:

其中原始值类型有5种,引用类型有1种
(一)Number (有包装对象 - new Number())

数值型,包括整形和浮点型
其中NaN,infinity都是Number类型

(二)String (有包装对象 - new String())

字符串类型,有两种表示方式,a: 双引号、b: 单引号。
在String.prototype原型上扩展了一些方法如toString()valueOfindexOf()chartAt()charCodeAt()等等。
String()方法可以将任意类型数据转成字符串。

在JS中有三种方法可以变量转成字符串

variable.toString() 此方法对null和undefined不可以,因为他们没有对应的包装对象

""+variable

String(variable)

(三)Boolean (有包装对象 - new Boolean())

1、只有两个值,truefalse,区分大小写
2、在JS的条件表达式或三目运算中,变量可以隐式转成Boolean值,
3、在JS中非Boolean类型的数据都可以转成Boolean类型,其中0-0null
undefined""NaN等6种会转成false,其余的都成true,即便是空对象{}空数组[]空函数function(){} 也是看做true

(四)Undefined (没有包装对象)

只有一个值undefined,没有任何属性和方法,但是undefined不属于保留字或关键字,在低版本浏览器中undefined可以被修改,为了得到纯正的undefined,可以使用一元操作符void 0,那么在JS代码中可以让一个变量和void 0做比较,就可以准确判断出是否是undefined啦。

variable === undefined // 如果变量variable未声明,直接使用,则会报错,"Uncaught ReferenceError: variable is not defined"
typeof variable === "undefined" // typeof操作符是唯一一个使用一个未声明的变量时是不会报错的(判断一个变量是否是undefined,推荐用此方法)
undefined === void 0 // true,void 0 可以得到纯正的undefined

在JS中有哪些情况会返回undefined ?

变量只声明未赋值(包括函数参数,没传参数时也是undefined)

访问一个对象不存在的属性

调用函数时没有明确指定返回值

使用void操作符对任意合法的js表达式运算

(五)Null (没有包装对象)

只有一个值null,没有任何属性和方法,在JS最初设计时,表示期望赋值为一个对象,可以理解为一个空指针,所以用
typeof操作符检测时,返回object

typeof null // object
(六)Object

在JS中使用typeof操作符时,ArrayDateRegExp的实例和Math都是"object"

undefinednull的区别大概5点

null是JS的关键字,undefined不是

在es3中,undefined是可以进行读/写操作的。
在es5中得到修正,undefined是只读的, null从来都不可以修改

typeof undefined // "undefined"
typeof null // "object"

强转数字时,Number()
Number(undefined) -> NaN
Number(null) -> 0

undefined == null // true 只判断值是否相等
undefined === null // false 即判断值是否相等,也要判断类型是否相等

NaN小结

NaN(全称 Not a Number)表示不是一个数字,是一个特殊的值,NaN不等于任何值(包括自身)。虽然是一个英文字符,但是它是number类型。类似的还有infinity也是number类型

typeof Infinity // "number"
typeof NaN // "number"
NaN === NaN // false 自身比较

有哪些情况会得到NaN?

无穷大除无穷大

对负数做开方运算

算术运算符参与非数字的运算

字符串转成数字

因此不能使用=====来判断一个变量是否是NaN,那么怎么办呢?
其实在JS我们可以通过一个全局函数isNaN()来判断一个变量是否是NaN。但是这个isNaN()有缺陷,它无法100%精准检测出是否是NaN,
解决方法:(可参考http://ourjs.com/detail/5383e...)
但是在ES5中,可以自己写方法来判断,

function _isNaN(num){
    return num !== num;
}
_isNaN("abc"); //

在ES6中,提供了Number.isNaN()可以准确检测出是否是NaN

typeof 操作符可以检测出6种类型,但是对数组、对象、null均返回object类型,所以typeof检测不准确

在JS中用于精准判断数据类型的方法有三种

constructor

// 根据对象的constructor判断数据类型(undefined、null除外,两个类型没有对应的包装对象`)
function Person(){}

console.log( p.constructor === Person);
console.log( p.constructor === Number );
console.log( p.constructor === String );
console.log( p.constructor === Boolean );
console.log( p.constructor === Object);
console.log( p.constructor === Function );
console.log( p.constructor === Date );
console.log( p.constructor === RegExp);

instanceof

 // 用于判断A的原型链中,是否存在B的原型
A instanceof B 
function Person(){}
var p=new Person();
console.log( p instanceof Person ); // true
console.log( p instanceof Object ); // true

toString

// 在Object对象的原型的toString方法
var p=10;
Object.prototype.toString.call(p) === "[object Number]"
var p="str";
Object.prototype.toString.call(p) === "[object String]"
var p=true;
Object.prototype.toString.call(p) === "[object Boolean]"
var p=undefined;
Object.prototype.toString.call(p) === "[object Undefined]"
var p=null;
Object.prototype.toString.call(p) === "[object Null]"
var p=[1,2,3];
Object.prototype.toString.call(p) === "[object Array]"
var p={name:"king"};
Object.prototype.toString.call(p) === "[object Object]"
var p=new Date();
Object.prototype.toString.call(p) === "[object Date]"
var p=/d+/;
Object.prototype.toString.call(p) === "[object RegExp]"
var p=function(){}
Object.prototype.toString.call(p) === "[object Function]"

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107331.html

相关文章

  • 原生JS揭秘—同步与异步

    摘要:中任务分类同步异步同步任务异步任务中异步类型定时任务网络请求回调函数事件绑定只能传入一个参数未完待续 JS中任务分类 同步 异步 同步任务 异步任务 JS中异步类型 定时任务 网络请求 回调函数 事件绑定 Promise(resolve只能传入一个参数) 未完待续...

    不知名网友 评论0 收藏0
  • 原生JS揭秘—揭开数据类型转换的面纱

    摘要:可以将其他类型转成字符串函数可以将任意类型的值转为布尔值。提示空数组空对象转换为布尔型也是。 在JS中数据类型转换有两种 相关资料参阅 官方ecma-5规范阮一峰老师类型转换规范对相等==定义 强制类型转换Number() Number函数将字符串转为数值,要比parseInt函数严格很多,只要有一个字符是非数字(空格、+、-除外),那么就会被转为NaN。 showImg(http...

    Moxmi 评论0 收藏0
  • 原生JS揭秘JS代码底层运行原理

    摘要:是一种基于对象的动态弱类型脚本语言以下简称,是一种解释型语言,和其他的编程语言不同,如等编译型语言,这些语言在代码执行前会进行通篇编译,先编译成字节码机器码。然后在执行。 JavaScript是一种基于对象的动态、弱类型脚本语言(以下简称JS),是一种解释型语言,和其他的编程语言不同,如java/C++等编译型语言,这些语言在代码执行前会进行通篇编译,先编译成字节码(机器码)。然后在执...

    xiongzenghui 评论0 收藏0
  • 原生JS揭秘—看清JS继承本质

    摘要:继承理论源于生活又高于生活在中继承,和现实生活中继承是相似的如儿子继承父亲财产子女的生理特性有父母的特性身高肤色性格等等只是一定比例上是这样的,不是绝对的一样中继承方法有以下几种本质区别方法特别注意是本质区别冒充继承也称之为借用构造函数这种 JS继承 理论源于生活、又高于生活 在JS中继承,和现实生活中继承是相似的 如:儿子继承父亲财产、子女的生理特性有父母的特性(身高、肤色、性格...

    sutaking 评论0 收藏0
  • 原生JS揭秘—撩开this的面纱

    摘要:随着函数使用场景的不同,而发生变化。是当前执行上下文中的一部分。在中新增了该方法也是强制更改指向。但是和的区别是更改后不会立即执行,它会返回一个新函数。 this何意?在英文中this是一个人称代词,表示这个的,具体指哪个?不确定,只有在具体的语境中才可确定,在编程语言中this也有同样的类似特性。在js中this是一个关键字,它不能被当做变量、属性,也不可以进行赋值操作。this 随...

    Brenner 评论0 收藏0

发表评论

0条评论

luck

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<