有人说JavaScript中没有类型,你觉得呢?
前言
🥸 JavaScript这样的动态语言
真的没有类型
嘛?
在 ES5.1 规范中对此进行了界定:
- 本规范中的运算法则所操纵的值均有相应的类型。
- ECMAScript类型又进一步细分为
语言类型
和规范类型
。
ECMAScript语言类型包括
Undefined
、Null
、Boolean
、String
、Number
和Object
🤓 还有些程序员会认为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