新浦京81707con > 功能介绍 > JavaScript隐式类型转换

原标题:JavaScript隐式类型转换

浏览次数:151 时间:2019-05-19

明天浏览部分技巧网站,看到这些题目。尽管觉着代码这么写的恐怕低之又低,不过却也考验对js理解的档次。

JavaScript隐式类型转换,javascript隐调换

JavaScript的数据类型是足够弱的(否则不会叫它做弱类型语言了)!在利用算术运算符时,运算符两边的数据类型能够是不管37二10一的,举个例子,3个字符串能够和数字相加。之所以分化的数据类型之间可以做运算,是因为JavaScript引擎在运算以前会蹑手蹑脚的把他们举行了隐式类型转变的,如下是数值类型和布尔类型的相加:

复制代码 代码如下:
3 true; // 4

结果是2个数值型!假诺是在C只怕Java遭逢的话,上边的运算分明会因为运算符两边的数据类型不雷同而招致报错的!不过,在JavaScript中,唯有少数状态下,错误类型才会变成出错,比方调用非函数,或许读取null或许undefined的质量时,如下:

复制代码 代码如下:
"hello"(1); // error: not a function
null.x; // error: cannot read property 'x' of null

大部意况下,JavaScript都不会出错的,而是自行的举行对应的类型转变。比如-, *, /,和%等算术运算符都会把操作数转换到数字的,可是“ ”号就有一些不一致了,有个别情况下,它是算术加号,某些意况下,是字符串连接符号,具体的要看它的操作数,如下:

复制代码 代码如下:
2 3; // 5
"hello" " world"; // "hello world"

可是,假设字符串和数字相加,会是什么样的结果吧?JavaScript会自行把数字调换到字符的,不管数字在前仍然字符串在前,如下:

复制代码 代码如下:
"2" 3; // "23"
2 "3"; // "23"

字符串和数字相加结果是字符串,字符串和数字相加结果是字符串,字符串和数字相加结果是字符串,主要的政工说3次!!!!!!

除此以外,要求小心的是,“ ”的运算方向是从左到右的,如下:

复制代码 代码如下:
1 2 "3"; // "33"

那与下部是等价的:

复制代码 代码如下:
(1 2) "3"; // "33"

对待,下边的结果是不均等的:

复制代码 代码如下:
1 "2" 3; // "123"

不过,隐式类型转变,有的时候候,会暗藏一些谬误的,举例,null会转变来0,undefined会调换到NaN。必要小心的是,NaN和NaN是不等于的(这是出于浮点数的精度决定的),如下:

复制代码 代码如下:
var x = NaN;
x === NaN; // false

纵然,JavaScript提供了isNaN来检查实验有个别值是还是不是为NaN,不过,那也不太可信赖的,因为,在调用isNaN函数以前,本身就存在了叁个隐式转换的进度,它会把那么些原来不是NaN的值转变到NaN的,如下:

复制代码 代码如下:
isNaN("foo"); // true
isNaN(undefined); // true
isNaN({}); // true
www4288com新萄京赌场,isNaN({ valueOf: "foo" }); // true

上边代码,大家选择isNaN来测试后,开采字符串,undefined,以至对象,结果都回来真!!!但是,大家总无法说她们也是NaN吧?简单的讲,得出的下结论是:isNaN检查测试NaN并离谱!!!

幸亏的是,有一种保障的同时准确的章程能够检查测试NaN。大家都知道,唯有NaN是友好不等和睦的,那么,大家就以应用不对等号(!==)来判断二个数是还是不是等于小编,从而,能够质量评定到NaN了,如下:

var a = NaN;
a !== a; // true
var b = "foo";
b !== b; // false
var c = undefined;
c !== c; // false
var d = {};
d !== d; // false
var e = { valueOf: "foo" };
e !== e; // false

大家也能够把这种方式定义成一个函数,如下:

function isReallyNaN(x) {
return x !== x;
}

OK,NaN的检查实验方法正是那般轻便,大家上面继续商讨对象的隐式转变!

目的是足以转变到原始值的,最布满的办法就是把它调换到字符串,如下:

"the Math object: "   Math; // "the Math object: [object Math]"
"the JSON object: "   JSON; // "the JSON object: [object JSON]"

目的转变到字符串是调用了她的toSting函数的,你能够手动的调用它来检验一下:

Math.toString(); // "[object Math]"
JSON.toString(); // "[object JSON]"

恍如的,对象也是能够转变到数字的,他是经过valueOf函数的,当然,你也是足以自定义这几个valueOf函数的,如下:

"J"   { toString: function() { return "S"; } }; // "JS"
2 * { valueOf: function() { return 3; } }; // 6

假如,二个目的同时设有valueOf方法和toString方法,那么,valueOf方法总是会被优先调用的,如下:

var obj = {
toString: function() {
return "[object MyObject]";
},
valueOf: function() {
return 17;
}
};
"object: "   obj; // "object: 17"

而是,多数景况下,那都不是我们想要的,一般的,尽可能使valueOf和toString表示的值一样(就算类型能够差异)。

最后壹种强制类型转变,大家平常称之为“真值运算”,例如,if, ||, &&,他们的操作数不鲜明是布尔型的额。JavaScript会通过轻易的转变规则,将一些非布尔类型的值调换来布尔型的。大多数的值都会调换到true,唯有少数的是false,他们各自是:false, 0, -0, ”", NaN, null, undefined,因为存在数字和字符串以及对象的值为false,所以,直接用真值转形成推断八个函数的参数是不是传进来了,那是不不太安全的。譬如,有三个足以具备暗中同意值得可选参数的函数,如下:

function point(x, y) {
if (!x) {
x = 320;
}
if (!y) {
y = 240;
}
return { x: x, y: y };
}

以此函数会忽略任何的真值为假的参数的,包蕴0,-0;

复制代码 代码如下:
point(0, 0); // { x: 320, y: 240 }

检验undefined的更是纯粹的章程是用typeof操作:

function point(x, y) {
if (typeof x === "undefined") {
x = 320;
}
if (typeof y === "undefined") {
y = 240;
}
return { x: x, y: y };
}

这种写法,能够区分开0和undefined的:

point(); // { x: 320, y: 240 }
point(0, 0); // { x: 0, y: 0 }

其余1种办法是采纳参数跟undefined作相比较,如下:

if (x === undefined) { ... }

总结:

  1. 品种错误有十分大可能率会被类型调换所隐藏。

2. “ ”既能够代表字符串连接,又能够表示算术加,那取决它的操作数,假如有八个为字符串的,那么,就是字符串连接了。

三. 指标通过valueOf方法,把温馨转变到数字,通过toString方法,把团结账和转账换到字符串。

四.怀有valueOf方法的对象,应该定义二个对应的toString方法,用来回到相等的数字的字符串格局。

五.检查评定一些未定义的变量时,应该使用typeOf或然与undefined作相比,而不该一向用真值运算。

有关JavaScript隐式类型转换就给我们介绍到这边,希望对大家有着帮衬!

JavaScript的数据类型是老大弱的(不然不会叫它做弱类型语言了)!在选取算术运算符时,运算符两边的数据类型能够是随便的,比如,八个字符串能够和数字相加。之所以区别的数据类型之间能够做运算,是因为JavaScript引擎在运算以前会私自的把他们实行了隐式类型转换的,如下是数值类型和布尔类型的相加:

在 JavaScript 中 (a ==1 && a== 2 && a==3) 可能为 true 吗?解释说nothing is impossible!

你只怕感兴趣的稿子:

  • 浅析JavaScript中的隐式类型调换
  • 简要介绍JavaScript数据类型之隐式类型调换

JavaScript的数据类型是极其弱的(不然不会叫它做弱类型语言了)!在运用算术运算符时,运算符两边...

复制代码 代码如下:

此间是三个或者的答案:

3 true; // 4

<script>
    const a = {
        i: 1,
        toString: function () {
           return a.i  ;
        }
    }

    if(a == 1 && a == 2 && a == 3) {
        console.log('Hello World!');
    }
</script>

结果是一个数值型!假若是在C或许Java意况的话,上边的运算料定会因为运算符两边的数据类型不均等而变成报错的!可是,在JavaScript中,唯有少数情形下,错误类型才会招致出错,比方调用非函数,也许读取null大概undefined的属性时,如下:

运维代码

复制代码 代码如下:

<script>
    const a = {
        i: 1,
        valueOf: function () {
           return a.i  ;
        }
    }

    if(a == 1 && a == 2 && a == 3) {
        console.log('Hello JavaScript!');
    }
</script>

"hello"(1); // error: not a function
null.x; // error: cannot read property 'x' of null

运转代码

大多数情形下,JavaScript都不会出错的,而是自行的开始展览对应的类型调换。比方-, *, /,和%等算术运算符都会把操作数调换成数字的,不过“ ”号就有一点不雷同了,某些处境下,它是算术加号,有个别意况下,是字符串连接符号,具体的要看它的操作数,如下:

最根本的或许强制类型转变。类型==,===运算符和强制调换:

复制代码 代码如下:

先看个表明式:

2 3; // 5
"hello" " world"; // "hello world"

<script>
    var res = "1.0e0" == { valueOf: function() { return true; } };
   console.log(res);
</script>

只是,假设字符串和数字相加,会是什么的结果吧?JavaScript会自动把数字转变到字符的,不管数字在前如故字符串在前,如下:

运行代码

复制代码 代码如下:

精确,这一个结果也是 true。

"2" 3; // "23"
2 "3"; // "23"

对此这么些表明式大家能够专注到:

字符串和数字相加结果是字符串,字符串和数字相加结果是字符串,字符串和数字相加结果是字符串,主要的事情说3次!!!!!!

它们的花色是不一致的。原因是在运算的时候进行了挟持调换。在相比前边,它们被转变到了数字。

其余,须要注意的是,“ ”的演算方向是从左到右的,如下:

字符串”一.0e0“被解析成数字一,而佚名对象通过调用本人的valueOf方法得到true,然后再调换到数字一。

复制代码 代码如下:

那也是a能够同时为一,2,三的来头。

1 2 "3"; // "33"

大家需求通晓的是:

这与下部是等价的:

一、假如表明式两边的数据类型不相同样,==运算符两边会议及展览开强制转换;

复制代码 代码如下:

二、此指标在被威吓调换时,会自动优先调用了自家的valueOf方法

(1 2) "3"; // "33"

三、即使此目的未有valueOf方法,则会继续品尝调用toString方法

相比较,上面包车型大巴结果是不均等的:

肆、即使将==运算符改成===运算符,则不会强制转变;

复制代码 代码如下:

本文由新浦京81707con发布于功能介绍,转载请注明出处:JavaScript隐式类型转换

关键词: 新浦京81707con

上一篇:Kubernetes集群部署,K8s集群安装和检查

下一篇:没有了