likes
comments
collection
share

有人说JavaScript中没有类型,你觉得呢?

作者站长头像
站长
· 阅读数 70

前言

🥸 JavaScript这样的动态语言真的没有类型嘛?

ES5.1 规范中对此进行了界定:

  • 本规范中的运算法则所操纵的值均有相应的类型。
  • ECMAScript类型又进一步细分为语言类型规范类型

ECMAScript语言类型包括 UndefinedNullBooleanStringNumberObject

🤓 还有些程序员会认为JavaScript中的类型应该称为标签子类型

JavaScript中必须有类型

😕 在项目开发中,不论是前端开发还是后端开发,都会碰到一个最头疼的问题 - 强制类型转换

例如:

  • 123(数字)"123"(字符串) 是不同的类型,一个是 number,一个是 string
  • 如果我们需要获取 string 类型的 123 中的 2 时,只需要使用
    • substr(1, 1)
  • 如果我们需要获取 number 类型的 123 中的 2 时,就需要使用
    • 强制类型转换(将 number 转为 string)

这个例子看似简单,但实际上强制类型转换的形式多种多样。

有些方式简单易懂,但是稍不留神可能就会出现一些意想不到的结果。

下面我们就来一起深入了解一下类型。

JavaScript中内置类型

😳 面试常问的七种内置对象:

  • null
  • undefined
  • boolean
  • number
  • string
  • object
  • symbol(ES6中新增)

除 object 外,其他统称为“基本类型”

我们可以使用 typeof 来查看值是何类型

typeof undefined === "undefined"    // true
typeof true === "boolean"    // true
typeof 123 === "number"    // true
typeof "123" === "string"    // true
typeof {name: "蜡笔小心_"} === "object"   // true
typeof Symbol() === "symbol"    // true
  • 以上六种类型均有同名的字符串值与之对应
  • 但是有一种类型并不在上面代码中,它就是一个比较特殊的类型,而typeof对它的处理有点问题
typeof null === 'object'    // true

null 在typeof中返回的值就是object,你可以理解为一个 bug,但是这个bug已经存在很多年了,可能这辈子是看不到它被“修复”

😯 当我们需要检测 null 值的类型时,我们可以使用复合条件来判断:

var a = null
if(!a && typeof a === 'object'){
    // 返回 true
}

object中的子类型

😨 在typeof判断中,有一种特殊情况:

typeof function foo(){} === "function"    // true
  • 这段代码看起来好像在JavaScript中还有一个内置对象 function(函数)

查看ES5.1中的规范就会知道,function 实际上是 object 中的一个“子类型”

函数是“可调用对象”,它有一个内部属性 - [[Call]],这个属性就能使它被调用。

😰 JavaScript中还支持数组,它也属于 object 中的子类型

typeof [1, 2, 3] === "object"    // true

undefined 和 undeclared

😤 变量在没有赋值的时候为 undefined,此时 typeof 返回的的 “undefined”

var a;
typeof a;    // "undefined"

var b = 1;
var c;
b = c;
typeof b;    // "undefined"
typeof c;    // "undefined"

在开发过程中,我们都倾向于将 undefined 等同于 undeclared(未声明),但是在JavaScript中它们完全是两回事。

  • 在作用域中声明了单还没有赋值的变量,就是 undefined
  • 还没有在作用域中声明的变量,才是 undeclared
var a;

a;   // undefined
b;   // ReferenceError: b is not defined

在浏览器中返回的错误信息来看,我们很容易将 b is not defined 误认为是 b is undefined。其实浏览器将错误信息改为b is not found 或者 b is not declared会更有好一点。

思考一下?

😳 如果是下面这种情况,会返回什么内容呢?为什么会返回这个内容呢?

typeof b;

总结

JavaScript中有七种内置类型,但是变量是没有类型的,变量中持有的值有类型,类型定义了值的行为特征。

undefined 和 undeclared 是两码事,但是我们常常将它们混为一谈。

如果有兴趣的话,可以实际去了解一下 undeclared 的原理。

转载自:https://juejin.cn/post/7157712820916731917
评论
请登录