javascript是魔术师---自动类型转换

在讲这个问题之前,有必要提一下js的五种基本类型,网上也有说是两种,六种,七种,八种的。这个不重要,重要的是你理解和你实践的是一致的就可以了。尽信书,不如不读书,所以要多实践。根据typeof返回的结果,常用的五种分类如下:

  • undefined - 如果变量是 Undefined 类型的
  • boolean - 如果变量是 Boolean 类型的
  • number - 如果变量是 Number 类型的
  • string - 如果变量是 String 类型的
  • object - 如果变量是一种引用类型或 Null 类型的

下面来看一段简单的代码:

var str = ‘hello world‘;

平平无奇的代码,硬是有人提出了问题。这个str明明就是一个基本的字符串类型,怎么在w3c上说是一个字符串对象?

有图有真相。我没有要黑w3c的意思。但是我不认为那是什么字符串对象。那么问题来了,为什么不是对象,还可以调用字符串对象上的那些方法呢?

这里就要引出“类型的隐式转换”问题了。在进一步讨论这个问题之前,先来看一个更常见的例子:

var num = ‘3‘;
var res = 10 - num;
console.log(res); // 7;
typeof num; // string;

num是一个字符3,按常理是不可以参与计算的,但是我硬拿它去和10做减法运算,结果居然给出了正常情况下,只有数字3才会有的结果。这很神奇吧?下面我来模拟一下这个自动隐式转换:

var num = ‘3‘;
var temp = Number(num);
var res = 10 - temp;
temp = null;

num;

可是很多人对此没有任何疑问,觉得理所当然,但是同样的现象发生在字符串上的时候,他们就困惑了。下面我就来好好说道说道这个“隐式自动类型转换”的问题。先看下面的代码:

var str = ‘hello‘;
str.charAt(1); //e

当我们在str上调用charAt方法的时候,js会自动在后台进行如下转换:

var temp = new Object(str);

输出 temp.charAt(1);

temp = null;

打铁要趁热,我们再看一个例子:

var str = ‘hello‘;
str.name = ‘frog‘; //没有报错
console.log(str.name); // undefined

str是一个字符串,却可以像对象一样的添加属性,但是明明设置了属性,却又拿不出来。我们再次用上面的原理去试一下:

var temp = new Object(str);

temp.name = ‘frog‘;

temp = null;

我们对str添加name属性,发生在temp这个中间对象上,所以不会有任何错误,完全合法。但是这个temp毕竟不是自己的,用完就要还。当我们在str上调用刚才设置

的name属性时,又再次触发上述过程:

var temp = new Object(str);

查找 temp.name 为undefined;

temp = null;

所以什么也找不到,但是也不会有错误。这就是为什么可以添加属性,却拿不出来的原因了,因为我们操作的是一个中间状态,系统会视情况为我们进行自动执行这个转换过程。

时间: 2024-08-27 21:13:29

javascript是魔术师---自动类型转换的相关文章

JavaScript系列文章:自动类型转换-续

在上一篇文章中,我们详细讲解了JavaScript中的自动类型转换,由于篇幅限制,没能覆盖到所有的转换规则,这次准备详细讲解一下. 上次我们提到了对象类型参与运算时转换规则: 1). 在逻辑环境中执行时,会被转换为true 2). 在字符串环境和数字环境中,它的valueOf()方法和toString()方法会依次被调用,然后根据返回值进行再次转换.首先,valueOf()方法会被调用,如果其返回值是基础类型,则将这个返回值转为目标类型,如果返回值不是基础类型,则再试图调用toString()方

JavaScript系列文章:自动类型转换

我们都知道,JavaScript是类型松散型语言,在声明一个变量时,我们是无法明确声明其类型的,变量的类型是根据其实际值来决定的,而且在运行期间,我们可以随时改变这个变量的值和类型,另外,变量在运行期间参与运算时,在不同的运算环境中,也会进行相应的自动类型转换. 自动类型转换一般是根运行环境和操作符联系在一起的,是一种隐式转换,看似难以捉摸,其实是有一定规律性的,大体可以划分为:转换为字符串类型.转换为布尔类型.转换为数字类型.今天我们就介绍一下这几种转换机制. 1. 转换为字符串类型(to s

自动类型转换

说完了强制类型转换,再来看看自动类型转换,实际上自动类型转换是建立在强制类型转换的基础上,当预期某个位置应该是某类型(布尔.数值.字符串)的数据时,就会调用相应的强制类型转换函数,这个是自动进行的. *当JavaScript遇到预期为布尔值的地方(比如if语句的条件部分),就会将非布尔值的参数自动转换为布尔值.系统内部会自动调用Boolean函数. 因此除了以下六个值,其他都是自动转为true. undefined null -0 0或+0 NaN ''(空字符串) *当JavaScript遇到

JavaScript之基础-3 JavaScript 数据类型、数据类型转换

一.数据类型 数据类型 基本类型 - 数字类型 - 既可以表示32位整数,也可以表示64位的浮点数 - 整数 - 十进制:逢十进一的整数,如1234567890 - 八进制:逢八进一的整数,如01235670 - 十六进制: - 浮点数 - 使用小数点记录数据,如 95.5,3.1415926 - 使用指数记录数据,如 4.3e23, 4.3E-23 string 类型 - 字符串类型 - 表示一系列的文本字符数据,如性别.姓名.住址等 - 由Unicode字符,数字,标点组成的序列 - Jav

JavaScript的类型自动转换高级玩法JSFuck

0 前言 最开始是不小心在微信公众号(程序员大咖)看到一篇JS的高逼格代码,然后通过里面的链接跳转到了JSFuck的wiki,就像顺着迷宫找宝藏的感觉,感叹JS的自动类型转换的牛逼. 1 样例 (!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]] //如何装逼用代码骂别人SB (([][[]]+[])[+!![]]+([]+{})[!+[]+!![]])//如何用代码优雅地证明自己NB 2 原理 1.对于非原

《javascript》高级程序设计——类型转换错误

容易发生类型转换错误的另一个地方,就是流控制语句.像if之类的语句在确定下一步操作之前,会自动把任何值转换成布尔值.尤其是if语句,如果使用不当,最容易出错.来看下面的例子. function concat(str1,str2,str3){ var result= str1 + str2; if (str3){ //绝对不要这样 result += str3; } return result; } 这个函数的用意是拼接两或三个字符串,然后返回结果.其中,第三个字符串是可选的,因此必须要检查.第3

详细理解javascript中的强制类型转换

将值从一种类型转换为另一种类型通常称为类型转换,这是显式的情况:隐式的情况称为强制类型转换,JavaScript 中的强制类型转换总是返回标量基本类型值,如字符串.数字和布尔值. 如何理解: 类型转换发生在静态类型语言的编译阶段,而强制类型转换则发生在动态类型语言的运行时? 1.如果是静态语言,比如c等,所有的类型转换应该都是在编译阶段处理的吧? 2.如果是动态语言,如js等, 编译阶段会处理类型转换吗? 一.ToString 它负责处理非字符串到字符串的强制类型转换 数字的字符串化遵循通用规则

JavaScript 图片广告自动与手动的切换

?1.代码 <html> <head>   <script type="text/javascript" src="jquery-1.8.js"></script>   <script type="text/javascript" src="pictrue-con.js"></script>   <style>            #pic1

自动类型转换之构造函数

在c/c++中,如果编译器看到一个表达式或函数调用使用了一个不适合的类型,它经常会执行一个自动类型转换,从现在的类型到所有要求的类型.在内置类型中我们经常看到例如: char c; int i=c; 上述语句就执行了自动类型转换.但是上面只是内置类型的自动类型转换,在c++中,还支持用户自定义的自动类型转换.有两种方法可以实习,第一种方法就是特殊类型的构造函数,第二种就是重载的运算符. 首先介绍第一种,特殊的构造函数.如果定义一个构造函数,这个构造函数把另一个类型的对象或者引用当做它的单个参数,