HTML5技术

【javascript】详解变量,值,类型和宿主对象 - 外婆的彭湖湾

字号+ 作者:H5之家 来源:H5之家 2017-09-03 13:26 我要评论( )

前言说一点不相关的事 实习结束,临近开学了, 想起几个星期前给第一次发红包, 给爷爷奶奶, 还有弟弟妹妹。心里有点小开心 ( ̄▽ ̄)" 好, 回到主题,我们今天要讲的是 JS数据类型 JS类型分类 讲到类型, 首先要说的当然是JS的类型分类, 对于这一点,《ja

前言——说一点不相关的事

实习结束,临近开学了, 想起几个星期前给第一次发红包, 给爷爷奶奶, 还有弟弟妹妹。心里有点小开心   ( ̄▽ ̄)"

 

 

 好, 回到主题,我们今天要讲的是——

JS数据类型

 

JS类型分类

 

讲到类型, 首先要说的当然是JS的类型分类, 对于这一点,《javascript高级语言程序设计》和《你不知道的javasvript》的阐述是有差异的(但想表达的意思是相同的)


我更倾向于前一本书(红宝书)的定义:
javascript的数据类型可分为两种: 基本类型和引用类型
基本类型: String, Number, Boolean, Null, undefined 和Symbol
引用类型: Object, Array, Function, RegExp, Date, 封装类型(基本包装类型)

 

我前面说了, 两本书对类型分类的阐述是有差异的, 关键出现在引用类型的Object身上, 因为Object是个特殊的存在, 事实上我们知道所有其他的引用类型如Array, Function, RegExp等都属于Object, 也就是说Object是这些的“父类型"

对此:
《你不知道的javasvript》里把其他引用类型一并归结为Object
《javascript高级语言程序设计》则是根据“外观”把Object和Array等放在平行的位置,就是说“看上去像” { }的是对象, 而像[ ]这样的, 虽然也是对象, 但我们还是叫它数组吧

弱类型的JS

在了解JS弱类型之前,我们需要了解一点—— JS里值才有类型,变量没有
我们经常会谈到JS的类型,其实是针对变量的值的,而不是变量。

例如
假设a = 1,则准确的说typeof a; 中的typeof是用来检测a的值的类型,而不是变量a的类型的

 

我们平时经常看到的检测某个变量(值)的类型, 其实是一种有意无意的省略(省略了“值”),这可能会带来误解

了解了这一点之后再让我们看看什么叫做JS的弱类型:
我们上面说到JS里值才有类型,变量没有,也就是JS里不会对变量做类型“强制” :不会要求一个变量从头到尾都只能保持初始化时的类型:

; console.log(typeof a); // string a = 1; console.log(typeof a); // number

 

所以说: 弱类型的特性是针对JS变量的(不要和前面的东西混淆了哦)

typeof和instanceof, 各有千秋

 

// 检测基本类型 console.log(, ); // 检测string string console.log(, console.log(,console.log(, typeof undefined); // 检测undefined undefined console.log(, typeof Symbol()); // 检测symbol symbol console.log(, typeof null); // 检测null object // 检测引用类型 console.log(, typeof {}); // 检测object object

 

typeof

 

检测一个数值的类型, 返回的是一个字符串(小写),去表示这个变量数值的类型

优点: 能检测出除了null外的所有内置类型

typeof的缺点:


1.不能检测除了function之外的引用类型
(function还是可以的哦!)

var fn = function () {}; var array = [1,2,3]; var reg = /\./; console.log(typeof fn); // function console.log(typeof array); // object console.log(typeof reg); // object

 

2. 检测null会检测出object


让我们看看《你不知道的javascript》中作者的原话:
“这个 bug 由来已久,在 JavaScript 中已经存在了将近二十年,也许永远也不会修复,因为这牵涉到太多的 Web 系统,“修复”它会产生更多的bug,令许多系统无法正常工作”


没错, 为了“向后兼容”, 我们是没法用直接的手段检测出null,下面我将会以比较多的篇幅介绍如何检测null

【注意】: 返回的字符串都是小写的哦!是 'string' 不是 'String'

 

instanceof


检测某个变量是否是某个对象的实例, 返回一个布尔型的数值

var obj = {}; var array = [1,2,3]; var fn = function () {}; var reg = /\./; // 检测具体的引用类型 console.log(obj instanceof Object); // true console.log(array instanceof Array); // true console.log(fn instanceof Function); // true console.log(reg instanceof RegExp); // true // 引用类型用Object去检测也是返回true的 console.log(array instanceof Object); // true console.log(fn instanceof Object); // true console.log(reg instanceof Object); // true

 

优缺点


优点: 能检测出引用类型的具体类型, 不像typeof一样只能检测出object, 而是检测出更加具体的类型如Array, RegExp等

缺点:

1.返回布尔值, 形式不够灵活
2. 不能检测基本类型

如:

); console.log(str instanceof String); // false console.log(strObj instanceof String) // true

 

可以看到,纯粹的基本类型是不能够检测出来的, 而要转化成对应的基本包装类型才能检测出来,当然了, 我猜大多数时候你都不会这么干

 

检测null的3种方式

1.这个是《你不知道的javascript》的解决方案

var a = null; ) { console.log() } // null被检测出来啦!!

 

写这篇博客的时候随口问了下旁边的室友:
知道JS中怎么检测null不? 你肯定不知道!
(此时我正做得意洋洋抖腿状)


然后他的表情是这样的:

 


说时迟那时快, 他一顿操作将我火速打脸。。。代码如下:

2. 通过null 包含的[[ class ]]内部属性检测(只做展示,不要这样做哦!!)

var a = Object.prototype.toString.call(null); console.log(a); // 输出 [object Null]

 

我马上意识到他是想用下面这种方式检测, 经过测试发现能够成功

) { console.log(); } // 打印: null被检测出来啦

 

当时打脸场景如下:

 


其实我是不服气的,因为觉得这段代码有点丑陋,于是又想了一种:

3. 通过JSON.stringfy(XXX) === 'null'检测null

) { console.log(); } // 打印: null被检测出来啦

 

引用类型中的神秘嘉宾——封装类型

 

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 【javascript】函数中的this的四种绑定形式 — 大家准备好瓜子,我要讲故事啦~~ - 外婆的彭湖湾

    【javascript】函数中的this的四种绑定形式 — 大家准备好瓜子,我要

    2017-08-16 11:00

  • 【javascript】详解javaScript的深拷贝 - 外婆的彭湖湾

    【javascript】详解javaScript的深拷贝 - 外婆的彭湖湾

    2017-08-15 12:01

  • 一次浴火重生的MySQL优化(EXPLAIN命令详解) - 禁心尽力

    一次浴火重生的MySQL优化(EXPLAIN命令详解) - 禁心尽力

    2017-08-02 14:00

  • AngularJS“路由”的定义概念、使用详解——AngularJS学习资料教程 - 我叫小熊

    AngularJS“路由”的定义概念、使用详解——AngularJS学习资料教程 -

    2017-07-12 11:01

网友点评