资讯专栏INFORMATION COLUMN

JavaScript数据类型及(隐式)类型转换详解

hiyayiji / 3329人阅读

摘要:显示的调用转换过程称为显式强制类型转换,隐式的情况称为隐式强制类型转换。隐式强制类型转换让代码变得晦涩难懂而又便捷而奇妙。事实上,允许在比较中进行强制类型转换,而不允许。如果有并且返回基本类型值,就使用该值进行强制类型转换。

JavaScript是一种非常灵活的现代编程语言,灵活到使用者极其容易被忽视的它那广阔的世界以及它带给我们的无限遐想空间。本文将对JavaScript最最基础也最容易被忽视的数据类型问题和类型转换问题进行探索。 数据类型

众所周知,JavaScript有8种内置数据类型:string,number,boolean,object,null,undefined,function,symbol(来自ES规范)。
除了object外,我们通常称其他类型为基本类型(typeof null 的运算结果是"object",有些人认为这是个由来已久的‘bug’)。基本类型可以想对象一样产生直接调用类型方法(如果有的话),如4.toFixed,"hello".split("l")等。

typeof 运算符总是会返回一个字符串
typeof sd;//"undefined"
var a = 3;
typeof a; // "number"
a = true;
typeof a; // "boolean"
typeof typeof 42; // "string"
typeof function a(){ /* .. */ }  // "function"
typeof {a:12,b:2};//"object"
typeof [121,2324];//"object"
typeof null ;//"object"
利用typeof 运算符安全的检查变量是否定义
//检查变量
// 这样会抛出错误ReferenceError
if (testObject) {
    console.log( "defined" );
}
// 这样是安全的
if (typeof DEBUG !== "undefined") {
    console.log( "defined" );
}
类型转换

类型转换(type casting)指的是将值从一种类型转换为另一种类型。显示的调用转换过程称为显式强制类型转换,隐
式的情况称为隐式强制类型转换(coercion)。但是坦白说,你知道,就是显示,你不知道,便是隐式。

显示类型转换

显式强制类型转换旨在让代码更加清晰易读

//这里为什么多了个"."?不加点(12.toString())js会认为12.是一个数字整体,故而报语法错误(SyntaxError)
12..toString();//"12"    
var num = 120;//"120"
Number("012");//12
parseInt("012.3asd88")//12;注意,parseInt返回Str[0]开始的有效数字字符组成的数字
parseFloat("012.3asd88")//12.3;
Boolean(10);//true
Boolean(new Boolean);//true;注意哦,这里会返回true

隐式类型转换

这是一种简化的语法,编译器为了我们方便(可能吧),在这方面帮我们做了很多事。
隐式强制类型转换是隐蔽的强制类型转换,而你自己觉得不够明显的强制类型转换都可以算作隐式强制类型转换。隐式强制类型转换让代码变得晦涩难懂而又‘便捷而奇妙’。

    +new Date();//1564536588540;== new Date().valueOf();
   "12" + 1;//"121"
    false - 1;//-1
    false - "1";//-1
    false + "1";//"false1"
    [1,2,3] + "";//"1,2,3"
    if(0 /*false*/){}
    if([] /*true*/){}
让人困惑的求等:==和===(宽松相等和严格相等)详解

JavaScript 中,判断两个值是否“相等”可以用宽松相等(loose equals) == 和严格相等(strict equals) === 。但是在判断条件上它们有一个很重要的区别。 不少人认为“ == 检查值是否相等, === 检查值和类型是否相等”。然而还不够准确。很多 JavaScript 的书籍和博客也是这样来解释 的,但是很遗憾他们都错了。 事实上,== 允许在比较中进行强制类型转换,而 === 不允许。 这几个情况需要注意:

•  null == 0;//false;null 除了null 和undefined,与null或undefined执行==都会得false
•  [] == ![];//true;意外吧!
•  false == []; // true
•  "" == 0; // true 
•  "" == []; // true
•  0 == []; // true
•  NaN === NaN;//false;NaN不等于NaN,不论严不严格
•  +0 === -0; //true;
•  "0" == false; // true
•  42 == "43"; // false
•  "foo" == 42; // false
•  "true" == true; // false
•  42 == "42"; // true
•  "foo" == [ "foo" ]; // true

根据ECMA规范,模糊相等计算‘==’一般是以下四种情况或者其组合:

var a = *;
var b = *;
a === b; 
a == b;

字符串和数字之间的相等比较

ES5 规范 11.9.3.4-5 这样定义:
(1) 如果 Type(x) 是数字, Type(y) 是字符串,则返回 x == ToNumber(y)
的结果。
(2) 如果 Type(x) 是字符串, Type(y) 是数字,则返回 ToNumber(x) == y
的结果。

其他类型和布尔类型之间的相等比较

ES5 规范 11.9.3.6-7 :
(1) 如果 Type(x) 是布尔类型,则返回 ToNumber(x) == y 的结果;
(2) 如果 Type(y) 是布尔类型,则返回 x == ToNumber(y) 的结果。

null 和 undefined 之间的相等比较

ES5 规范 11.9.3.2-3 :
(1) 如果 x 为 null , y 为 undefined ,则结果为 true 。
(2) 如果 x 为 undefined , y 为 null ,则结果为 true 。

对象和非对象之间的相等比较

ES5 规范 11.9.3.8-9 :
(1) 如果 Type(x) 是字符串或数字, Type(y) 是对象,则返回 x == ToPrimitive(y)的结果;
(2) 如果 Type(x) 是对象, Type(y) 是字符串或数字,则返回 ToPromitive(x) == y的结果。
抽象操作 ToPrimitive (参见 ES5 规范 9.1 节)是为了求对象的‘值’,它首先(通过内部操作 DefaultValue ,参见 ES5 规范 8.12.8 节)检查该值是否有 valueOf() 方法。
如果有并且返回基本类型值,就使用该值进行强制类型转换。如果没有就使用 toString()的返回值(如果存在)来进行强制类型转换。
如果 valueOf() 和 toString() 均不返回基本类型值,会产生 TypeError 错误。

注意,对 == 两边的值认真推敲,为了避开不必要的错误,我们可以遵循两个原则。

• 如果两边的值中有 true 或者 false ,千万不要使用 == 。
• 如果两边的值中有 [] 、 "" 或者 0 ,尽量不要使用 == 。


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

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

相关文章

  • JavaScript 运算符规则与隐式类型转换详解

    摘要:我们再来回顾下文首提出的这个比较运算,首先为对象,则调用函数将其转化为字符串对于右侧的,首先会进行显式类型转换,将其转化为。 JavaScript 运算符规则与隐式类型转换详解 从属于笔者的现代 JavaScript 开发:语法基础与工程实践系列文章,主要探讨 JavaScript 中令人迷惑的加减乘除与比较等常见运算中的规则与隐式类型转换;本文中涉及的参考资料全部声明在了JavaSc...

    Kyxy 评论0 收藏0
  • JavaScript 运算符规则与隐式类型转换详解

    摘要:我们再来回顾下文首提出的这个比较运算,首先为对象,则调用函数将其转化为字符串对于右侧的,首先会进行显式类型转换,将其转化为。 JavaScript 运算符规则与隐式类型转换详解 从属于笔者的现代 JavaScript 开发:语法基础与工程实践系列文章,主要探讨 JavaScript 中令人迷惑的加减乘除与比较等常见运算中的规则与隐式类型转换;本文中涉及的参考资料全部声明在了JavaSc...

    snifes 评论0 收藏0
  • JavaScript隐式类型转换

    摘要:所谓装箱转换,正是把基本类型转换为对应的对象,他是类型转换中一种相当重要的种类。拆箱转换在标准中,规定了函数,它是对象类型到基本类型的转换即,拆箱转换。拆箱转换会尝试调用和来获得拆箱后的基本类型。 JavaScript隐式类型转换 基本数据类型 ECMAScript 一共定义了七种 build-in types,其中六种为 Primitive Value,Null, Undefined...

    bingo 评论0 收藏0
  • JavaScript类型系统详解

    摘要:基本数据类型中有种简单数据类型也称基本数据类型,,,和。不支持任何创建自定义类型的机制,而所有值都是上述中数据类型之一。 基本数据类型 ECMAScript中有5种简单数据类型(也称基本数据类型):Undefined,Null,Boolean,Number和String。还有一种复杂数据类型(引用型)Object。ECMAScript不支持任何创建自定义类型的机制,而所有值都是上述6中...

    ruicbAndroid 评论0 收藏0
  • 数据入门指南(GitHub开源项目)

    摘要:项目地址前言大数据技术栈思维导图大数据常用软件安装指南一分布式文件存储系统分布式计算框架集群资源管理器单机伪集群环境搭建集群环境搭建常用命令的使用基于搭建高可用集群二简介及核心概念环境下的安装部署和命令行的基本使用常用操作分区表和分桶表视图 项目GitHub地址:https://github.com/heibaiying... 前 言 大数据技术栈思维导图 大数据常用软件安装指...

    guyan0319 评论0 收藏0

发表评论

0条评论

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