最近在学习渡一教育的JavaScript精品课,成哥讲的还是很棒的,开这个系列记录下学习笔记
本次学习笔记,对应web前端开发JavaScript精英课js的第六课时
目录
一.is NaN()
当调用is NaN()方法时,会隐式的把调用者以Number(xxx)的方式转换为number类型,
需要注意的是,转换时不会改变调用者的数据类型
<script>
var a = "abc";
console.log(isNaN(a) + " : " + typeof(a)); // true : string 不会改变原类型
console.log(isNaN(null)); // false
</script>
还有一点就是Number(null) 得到的返回值为0,因此isNaN(null)的返回值为false
二.++ -- 自增自减运算符
当使用自增自减运算符时,无论是b++还是++b都会首先调用Number(b)转换为number类型
且因为这是直接对原参数操作,会改变原参数的数据类型
<script>
var b = "123";
console.log(typeof(b)); // String
console.log(++b); // 124
console.log(--b); // 123
console.log(typeof(b)); // Number
b = "abc";
console.log((b++) + " : " + typeof(b)); // NaN number 会改变原类型
</script>
还有一点特殊情况就是,如最后的 console.log((b++) + " : " + typeof(b)); 尽管“abc”转换为Number失败了,变为了NaN,但是其数据类型依然是number
三. + - (一元正负)
<script>
var c = +"abc";
console.log(c + " : " + typeof(c)); // NaN number
c = -"abc";
console.log(c + " : " + typeof(c)); // NaN number
</script>
没啥好说的,加了+ / -就是相当于正数和负数,隐式调用Number(xxx),转换为了number类型
四. + (连接符)
这个就更加没啥好说的了,学过Java再熟悉不过 就一个字符串拼接
<script>
var d = "abc";
var d1 = 123;
console.log((d+d1) + " : " + typeof(d1)); // abc123 number 不会改变原类型
</script>
五. - * / % 运算符
var e = "3" * 2; 在控制台调试下会发现等于6,其实本质上也是使用Number(xxx)隐式转换字符串为number类型了,具体可看下面例子
<script>
var e = "abc";
var e1 = e - 1;
var e2 = e * 1;
var e3 = e / 1;
var e4 = e % 1;
console.log(e1 + ":" + typeof(e1)); // NaN number
console.log(e2 + ":" + typeof(e2)); // NaN number
console.log(e3 + ":" + typeof(e3)); // NaN number
console.log(e4 + ":" + typeof(e4)); // NaN number
</script>
e1 e2 e3 e4均被转换为number类型了
六. > < >= <=
若字符串的内容为数字,与另外一个数字比较 那么字符串内容为数字的字符串会被Nunber(xxx)隐式转换为number类型再比较
若字符串与字符串比较 则会从首个字符开始比较unidode码顺序
需要注意的是下面第一种情况 数字和字符串内容非数字的字符串相比返回值为false,因为Number()会把它转为NaN 无法比较
<script>
// 注意数字和非数字字符串比较 如下 会变这样3 > Number("!"); 而和NaN自然无法比较 什么都是false
console.log(3 > "!");
// 当字符串是数字 和数字比较 原理同上
console.log(3 > "2"); // true
// 特殊的
console.log("true > 'a' --- " + (true > "a")); // false
console.log("true < 'a' --- " + (true < "a")); // false
console.log("true == 'a' --- " + (true == "a")); // false
</script>
七. == !=
若与数字比较则,会隐式转换为数字 无论是字符串形式的数字还是普通数字
需要注意的是最后两个 false == "" 返回值为true 以及 NaN == NaN 返回值为false
<script>
// 与数字比较则会隐式转换为数字 无论是字符串形式的数字还是普通数字
console.log(1 == true); // true
console.log(0 == false); // true
console.log(3 == "3"); // true
console.log("false == undefined --- " + (false == undefined)); // false
console.log("false == null --- " + (false == null)); // false
console.log("false == NaN --- " + (false == NaN)); // false
console.log("true == '1' --- " + (true == "1")); // true
console.log("false == '0' --- " + (false == "0")); // true
console.log("false == '' --- " + (false == "")); // true 这个很特殊
console.log("NaN == NaN --- " + (NaN == NaN)); // false
</script>
八. 特殊规律
没什么好说的 记住就完事了
<script>
console.log(undefined > 0); // false
console.log(undefined < 0); // false
console.log(undefined == 0); // false
console.log(null > 0) // false
console.log(null < 0); // false
console.log(null == 0); // false
console.log(undefined == null); // true
console.log(typeof(NULL) == typeof(undefined)); // true 因为NULL相当于一个未定义的变量
console.log(typeof(null)); // object 规定的
console.log(typeof(undefined)); // undefined 规定的
console.log(typeof(NaN)); // number 也很特殊 规定的
console.log(typeof typeof(NaN));// string 因为typeof(NaN)返回的是一个string类型
var student1 = {
name : "ljy",
id : 123
}
var student2 = new Object();
console.log(Number(student1)); // NaN 但如果用typeof测试会知道其实已经转为number
console.log(Number(student2)); // NaN 但如果用typeof测试会知道其实已经转为number
console.log(Boolean(null)); // false
console.log(Boolean(undefined));// false
</script>
最后要记住的就是 typeof()返回的是字符串 比如 typeof(typeof(undefined));返回值为string