JavaScript高级程序设计第三章:基本概念

本文大部分来自:https://home.cnblogs.com/u/xiaohuochai/

3.4 数据类型:

https://www.cnblogs.com/xiaohuochai/p/5586166.html

基本数据类型:Undefined, Null, Boolean, Number, String

复杂数据类型:Object

Number:

NaN(not a number)表示非数字,NaN与任何值都不相等,包括NaN本身,且任何涉及NaN的操作都会返回NaN

5 - 'x'; //NaN
Math.acos(2); //NaN
0 / 0; //NaN
NaN == NaN;//false
NaN == Infinity;//false
[NaN].indexOf(NaN);// -1
Boolean(NaN); // false

  isNaN()来判断这个数字是不是NaN,包含着隐式类型转换Number()

console.log(isNaN(Infinity));//false
console.log(isNaN(0));//false
console.log(isNaN(NaN));//true
console.log(isNaN('Hello'));//true

  判断NaN更可靠的方法是,利用NaN是javascript之中唯一不等于自身的值这个特点,进行判断

function myIsNaN(value) {
  return value !== value;
}

https://blog.csdn.net/songshuguowang/article/details/86476053

转成数值

  有3个函数可以把非数值转换成数值:Number()、parseInt()和parseFloat()。其中Number()可以将任意类型的值转化成数值,而parseInt()和parseFloat()只应用于字符串向数字的转换

Number()

  当把Number()当作一个函数来调用,而不是作为构造器,它执行一个类型转换。使用Number()函数可以将任意类型的值转化成数值

复制代码

// 数值:十进制数字
console.log(Number(11),Number(011),Number(0x11));//11 9 17

// undefined:转成 NaN
Number(undefined) // NaN

// null:转成0
Number(null) // 0

// 布尔值:true 转成1,false 转成0
console.log(Number(true),Number(false));//1 0

复制代码

  Number()函数解析字符串时会识别出字符串的前置空格并去掉

  【1】若字符串只包含十进制或十六进制数字,则转成十进制的数字

    [注意1]Number()不识别八进制数字的字符串,会按照十进制数字处理

    [注意2]字符串'1.2.'不会报错,但数字1.2.会报错

  【2】若字符串为空字符串或空格字符串,则转成0

  【3】其他情况的字符串,则转成NaN

复制代码

console.log(Number('    123'));//123
console.log(Number('1.2.'));//NaN
console.log(Number(1.2.));//报错
console.log(Number(''),Number(' '));//0 0 
console.log(Number('11'),Number('011'),Number('0x11'));//11 11 17
console.log(Number('abc'));//NaN
console.log(Number('123abc'));//NaN

复制代码

  Number()函数解析对象时,会按照以下步骤进行处理 

  【1】调用对象的valueOf()方法,如果返回原始类型的值,则直接对该值使用Number()函数

  【2】如果valueOf()方法返回的还是对象,则调用对象的toString()方法,如果返回原始类型的值,则对该值使用Number()函数

  【3】如果toString()方法返回的依然是对象,则结果是NaN

  在第一步中,由于只有时间Date()对象返回的是原始类型的值数字,所以Number(new Date())返回现在到1970年1月1日00:00:00的数值类型的毫秒数

Number(new Date())//1465976459108

  在第二步中,数组Array类型返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串,如果字符串中只存在数字,则返回数字,其他情况返回NaN;由于其他对象的toString()方法返回的字符串中不只包括数字,所以返回NaN

复制代码

Number([]);//0
Number([0]);//0
Number([-0]);//0
Number([10]);//10
Number([1,2]);//NaN
Number(其他对象);//NaN

parseInt()

  【1】parseInt()专门用于把字符串转换为整数。在转换字符串时,会忽略字符串前面的空格,直到找到第一个非空格字符。如果第一个字符不是数字字符或者符号,parseInt()就会返回NaN。如果是,则继续解析,直到解析完成或者遇到非数字字符。

console.log(parseInt('    123.8px'));//123
console.log(parseInt('   123.8   '));//123
console.log(parseInt(' -123.8px'));//-123
console.log(parseInt('a123.8px'));//NaN
console.log(parseInt('0 123.8px'));//0

  【2】parseInt()可以识别出各种进制的数字,输出的是运算后的十进制的数字,如1.0或1.或01会以1输出。在解析八进制字面量的字符串,ECMAScript3会解析八进制,但ECMAScript5没有解析八进制的能力

复制代码

console.log(parseInt('11'));//11
console.log(parseInt(11));//11
console.log(parseInt('11.1'));//11
console.log(parseInt(11.1));//11
console.log(parseInt('011'));//11
console.log(parseInt(011));//9
console.log(parseInt('011.1'));//11
console.log(parseInt(011.1));//报错
console.log(parseInt('0x11'));//17
console.log(parseInt(0x11));//17
console.log(parseInt('0x11.1'));//17
console.log(parseInt(0x11.1));//报错

复制代码

  [注意]对于那些会自动转为科学计数法的数字,parseInt会将科学计数法的表示方法视为字符串,因此导致一些奇怪的结果

复制代码

console.log(parseInt(1000000000000000000000.5)); // 1
// 等同于
console.log(parseInt('1e+21')); // 1

console.log(parseInt(0.0000008)); // 8
// 等同于
console.log(parseInt('8e-7')); // 8

复制代码

  【3】parseInt()方法还可以接受第二个参数(2到36之间),表示被解析的值的进制,返回该值对应的十进制数。默认情况下,parseInt的第二个参数为10,即默认是十进制转十进制

console.log(parseInt('11',2));//3
console.log(parseInt('11',8));//9
console.log(parseInt('11',10));//11
console.log(parseInt('11',16));//17

  如果第二个参数不是数值,会被自动转为一个整数。这个整数只有在2到36之间,才能得到有意义的结果,超出这个范围,则返回NaN。如果第二个参数是0、undefined和null,则直接忽略

console.log(parseInt('10', 37)); // NaN
console.log(parseInt('10', 1)); // NaN
console.log(parseInt('10', 0)); // 10
console.log(parseInt('10', null)); // 10
console.log(parseInt('10', undefined)); // 10

  如果字符串包含对于指定进制无意义的字符,则从最高位开始,只返回可以转换的数值。如果最高位无法转换,则直接返回NaN

console.log(parseInt('1546', 2)); // 1
console.log(parseInt('546', 2)); // NaN

  【4】parseInt()是专门用来处理字符串转换数字的,parseInt处理非字符串和数字类型时输出NaN。但是,实际上parseInt()包含着隐式的toString()方法,所以parseInt([数字或字符串])输出对应的数字

console.log(parseInt(null),parseInt(undefined));//NaN NaN
console.log(parseInt(true),parseInt(false));//NaN NaN
console.log(parseInt([]),parseInt(['2.5px']),parseInt([2.5]));//NaN 2 2
console.log(parseInt(''),parseInt(' '),parseInt({}));//NaN NaN NaN

parseFloat()

  【1】parseFloat()专门用于字符串转换浮点数。同样地,解析时会忽略字符串前面的空格,直到找到第一个非空格字符,然后一直解析到字符串末尾或一个无效的浮点数字字符为止

复制代码

console.log(parseFloat('    0123.px'));//123
console.log(parseFloat('    123.px'));//123
console.log(parseFloat('    123.1px'));//123.1
console.log(parseFloat('   123.1.2px   '));//123.1
console.log(parseFloat(' -123.0px'));//-123
console.log(parseFloat('.123.1px'));//0.123
console.log(parseFloat('0 123px'));//0

复制代码

  [注意]如果字符串符合科学计数法,则会进行相应的转换

console.log(parseFloat('314e-2')); // 3.14
console.log(parseFloat('0.0314E+2')); // 3.14

  【2】parseFloat()可以识别不同进制的数字,但只能解析十进制字符串

复制代码

console.log(parseFloat('11'));//11
console.log(parseFloat(11));//11
console.log(parseFloat('11.1'));//11.1
console.log(parseFloat(11.1));//11.1
console.log(parseFloat('011'));//11
console.log(parseFloat(011));//9
console.log(parseFloat('011.1'));//11.1
console.log(parseFloat(011.1));//报错
console.log(parseFloat('0x11'));//0
console.log(parseFloat(0x11));//17
console.log(parseFloat('0x11.1'));//0
console.log(parseFloat(0x11.1));//报错

复制代码

  【3】parseFloat()是专门用来处理字符串转换浮点数的,parseFloat处理非字符串和数字类型时输出NaN。但是,实际上parseFloat()包含着隐式的toString()方法,所以parseFloat([数字或字符串])输出对应的数字

console.log(parseFloat(null),parseFloat(undefined));//NaN NaN
console.log(parseFloat(true),parseFloat(false));//NaN NaN
console.log(parseFloat([]),parseFloat([2.1]),parseFloat(['2.1px']));//NaN 2.1 2.1 
console.log(parseFloat(''),parseFloat({}));//NaN NaN

  [注意]Number('')的结果是0,parseInt('')和parseFloat('')的结果是NaN

3.5 操作符

逻辑运算符

https://www.cnblogs.com/xiaohuochai/p/5616992.html

相等运算符

  相等运算符'=='和恒等运算符相似,但相等运算符的比较并不严格,如果两个操作数不是同一类型,相等运算符会尝试进行一些类型转换,然后再进行比较

  当两个操作数类型相同时,比较规则和恒等运算符规则相同

console.log(undefined == undefined);//true
console.log(10 == 0xa);//true
console.log(NaN == NaN);//false
console.log([] == []);//false

  当两个操作数类型不同时,相等运算符'=='会遵守如下规则:

  【1】如果一个值是对象类型,另一值是原始类型,则对象类型会先使用valueOf()转换成原始值,如果结果还不是原始值,则再使用toString()方法转换,再进行比较

  [注意]日期类只允许使用toString()方法转换为字符串。类似地,时间Date对象进行加法运算时使用toString()转换为字符串,而在其他数学运算,包括减法、乘法、除法、求余等运算中,都是使用Number()转换函数将时间Date对象使用valueOf()转换为数字

  【2】在对象转换为原始值之后,如果两个操作数都是字符串,则进行字符串的比较

console.log(new Date() == 'Sat Jun 25 2016 11:07:20 GMT+0800 (中国标准时间)');//true

  【3】在对象转换为原始值之后,如果至少有一个操作数不是字符串,则两个操作数都将通过Number()转型函数转换成数字进行数值比较

复制代码

console.log(true == 1);//true
console.log(true == 0);//false
console.log(false == '1');//false
console.log(false == '0');//true
console.log(true == 'true');//false,相当于1 == NaN

console.log([1] == 1);//true,相当于1 == 1
console.log([1] == '1');//true,相当于'1' == '1'
console.log([] == 0);//true,相当于0 == 0
console.log([] == '0');//false,相当于'' == '0'

console.log([] == true);//false,相当于0 == 1
console.log([1] == true);//true,相当于1 == 1

复制代码

复制代码

var a = {
    valueOf:function(){
        return 1;
    },
    toString:function(){
        return '2';
    }
} 
console.log( a == '1');//true,相当于1 == 1

var a = {
    valueOf:function(){
        return {};
    },
    toString:function(){
        return '1';
    }
} 
console.log( a == 1);//true,相当于1 == 1

复制代码

  [注意]如果一个值是null,另一个值是undefined,则返回true。虽然Number(null)是0,但null和0并不相等

console.log(null == undefined);//true
console.log(null == 0);//false

  [注意]空字符串或空格字符串会转成0

console.log(null == []);//false
console.log(null == '');//false
console.log([] == ' ');//false,相当于'' == ' '
console.log([] == '');//true,相当于'' == ''
console.log(0 == '');//true

 【不相等运算符】

  不相等运算符(!=)的操作数比较过程与相等运算符相同,结果取反。如果'=='的比较结果是true,则'!='的比较结果是false;如果'=='的比较结果是false,则'!='的比较结果是true

console.log(1 != '1');//false,相当于1 != 1
console.log(true != '1');//false,相当于1 != 1
console.log('true' != 1);//true,相当于NaN != 1
console.log([1] != '1');//false,相当于'1' != '1'
console.log([1] != true);//false,相当于1 != 1

记住:null==undefined会返回true, 因为他们是相似类型的值;但null===undefined会返回false, 因为他们是不同类型的值。

3.6:语句

for-in: 用来枚举对象的属性

for(var propName in window){

document.write(propName)

}

label: 可以在代码中添加标签,以便将来使用。

3.7:函数

https://www.cnblogs.com/xiaohuochai/p/5706289.html

关于传递参数的一个问题

https://zhidao.baidu.com/question/182369706005120844.html

 

 

 

 

 

 

 

 

 

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值