JavaScript高级程序设计--数据类型(1)

文章较长,建议收藏以便浏览

《JavaScript高级程序设计(第三版)》学习总结

  在JavaScript中,数据类型分为基本数据类型引用数据类型两中:

  • 基本数据类型:stringnumberbooleannullundefinedSymbol(ES6新增)
  • 引用数据类型:objectarrayfunction
  • 两种数据类型的区别:
    • 基本数据类型是存在内存中的,按值访问;引用数据类型是存在内存中的,按地址访问。
Undefined类型
  • Undefined类型只有一个特殊的值,即undefined,那么什么情况下为产生undefined呢?
  1. 一个变量声明了却没有被赋值(获取未声明的变量不会是undefined会报错)
    var a
    console.log(a) // undefined
    console.log(b) // 报错:b is not defined
    
  2. 一个对象上不存在的属性或方法
    var obj = {
        name: 'luffy'
    }
    console.log(obj.name) // luffy
    console.log(obj.age) // undefined
    
  3. 一个数组中没有被赋值的索引
    var arr = [1,2,3]
    console.log(arr[3]) // undefined
    arr[8] = 9
    console.log(arr[8]) // 9
    console.log(arr[7]) // undefined
    
Null类型
  • Null类型也是只有一个特殊的值,即null。从逻辑角度看,null值表示一个空对象指针,因此会有下面的结果:
console.log(typeof null) //object
  • 但是因为null不具有任何对象的特性,所以使用instanceof检测时会返回false:
console.log(null instanceof Object) //false
Boolean类型
  • Boolean类型只有两个字面值:truefalse(区分大小写,True/False以及其它混合大小写的形式都不是Boolean值,只是标识符)。
  • 使用Boolean()函数可以将其它数据类型转为Boolean类型,返回值取决于要转换值的数据类型及其实际值。下表为相应的转换规则:
数据类型转为true的值转为false的值
Booleantruefalse
UndefinedN/Aundefined
String任何非空字符串空字符串
Number任何非零数0和NaN
Object任何对象null
  • 需要区分的是以下几种情况
// 因为[]属于Object,并且不是null,所以下面的值为true
Boolean([]) // true
// 但是对象和Boolean值进行比较时,对象会进行转换-->字符串-->数字;
// Boolean值会进行转换-->数字
console.log([] == true);  //false  ([]-->''-->0; true-->1)
console.log([] == false); // true  ([]-->''-->0; false-->0)
console.log(![] == false); // true  (因为加了!,所以[]-->true)
Number类型
  • Number类型包括整数和浮点数值,同时定义了不同的数值字面量格式来支持各种数值类型。
浮点数值
  • 浮点数值就是该数值中必须包含一个小数点,并且小数点后必须至少有一位数字。
let a1 = 1.1 // 1.1
let a3 = .1 // 0.1,不推荐
// 由于保存浮点数值需要的内存空间是保存整数值得两倍,
// 所以ECMAScript会自动将部分浮点数值转为整数
let a2 = 1. // 1
let a4 = 1.0 // 1
  • 对于极大或极小的值,可以用e表示法(e前面的数值乘以10的指数次幂)表示
let a = 1.2e3 // 1.2*10^3^ = 1200
let b = 3e-4 // 3 * 10^-4^ = 0.0003
  • 典型问题:console.log(0.1+0.2 == 0.3) // false
    • 原因: 浮点数运算有精度误差问题,根本原因是运算转换为二进制,小数点后支持52位,再把它转换为十进制,结果就成了0.30000000000000004,所以是false
数值字面量
  • 最基本的数值字面量格式是10进制整数: let a = 55
  • 2进制字面值的前两位必须是0b,后跟0或1:let a = 0b11是2进制的3
  • 8进制字面值的第一位必须是0,后跟8进制数字序列(0~7): let a = 070是8进制的56
  • 16进制字面值的前两位必须是0x,后跟16进制数字序列(0~9 和 A~F):let a = 0xA是16进制的10
  • 进制转换
    • parseInt(str,radix)把radix进制(默认为10)字符串转为10进制返回
    console.log(parseInt('11', 2)) // 3
    console.log(parseInt('11', 8)) // 9
    console.log(parseInt('11', 16)) // 17
    console.log(parseInt('11')) // 11
    
    • Number.toString(radix)默认将10进制数字转为radix进制
    let a = 22
    console.log(a.toString(2)) // 10110
    console.log(a.toString(8)) // 26
    console.log(a.toString(16)) // 16
    console.log(a.toString()) // 22
    
NaN
  • NaN(Not a Number)表示一个本来要返回数值的操作数未返回数值的情况
  • isNaN()验证参数是否“不是数值”
console.log(isNaN(10)) // false
console.log(isNaN("10")) // false
console.log(isNaN("hello")) // true
console.log(isNaN(true)) // false
  • 典型问题:NaN==NaN的结果为false
    • 原因: NaN 属性是代表非数字值的特殊值,该属性用于指示某个值不是数字,NaN不与任何值相等,比如"aa","bc"都为NaN,它们两个相比的结果肯定是false
转为数值
  • Number()适用于任何数据类型
  • parseInt(str,radix)只适用于String类型,其它类型返回NaN
  • parseFloat(str)只适用于String类型,其它类型返回NaN,并且只解析十进制
console.log(parseInt("0xA")) // 10
console.log(parseFloat("0xA")) // 0
String类型
  • String类型用于表示由0个或者多个16位Unicode字符组成的字符串。
字符字面量
  • String数据类型包含一些特殊的字符字面量(转义序列),用于表示非打印字符或者具有其它用途的字符。如下表所示
字面量含义
\n换行
\t制表
\b空格
\r回车
\f进纸
\斜杠\
\ ’单引号 ’
\ "双引号 "
\xnn以十六进制代码nn表示一个字符(n为0~F)
\unnnn以十六进制代码nnnn表示一个Unicode字符(n为0~F)
转换为字符串
  • String()适用于任何数据类型
  • toString()不适用于null、undefined
    • toString()方法是Number、Boolean、Object、String自身拥有的方法
Symbol类型
  • ES6引入了一种新的原始数据类型Symbol,表示独一无二的值
    • ES5的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是ES6引入Symbol的原因。

let s = Symbol();
console.log(typeof s) // symbol

Symbol函数前不能使用new命令,否则会报错。这是因为生成的Symbol是一个原始类型的值,不是对象。也就是说,由于Symbol值不是对象,所以不能添加属性。基本上,它是一种类似于字符串的数据类型。

类型判断
  • typeof()用来检测一个变量的类型,返回值为字符串(‘undefined’/‘object’/‘number’/‘boolean’/‘string’/‘function’/‘symbol’)
typeof    1              // number
typeof    undefined      //undefined
typeof    { }            //object
typeof    [ ]            //object
typeof    console.log()  //undefined
typeof    console.log    //function
typeof    number      	 //undefined
typeof    Number      	 //function
typeof    Function    	 //function
  • instanceof检测的是原型,内部机制是通过判断对象的原型链中是否有类型的原型
var arr = [1,2,3,4];
console.log(arr instanceof Array)//true;
  • constructor:根据prototype追溯数据类型
''.constructor == String // true
1.constructor == Number // true
[].constructor == Array // true
  • Object.prototype.toString.call():数组,正则,日期,对象上的判断
const call = Object.prototype.toString.call()
call(new Date);//[object Date]
call(new String);//[object String]
call(Math);//[object Math]
call(undefined);//[object Undefined]
call(null);//[object Null]
  • 四则运算
    • 加法运算符+是双目运算符,只要其中一个是String类型,表达式的值便是一个String
    • 对于其他的四则运算,只要其中一个是Number类型,表达式的便是一个Number
    • 对于非法字符的情况通常会返回NaN:‘1’*‘a’ // => NaN
let s1 = "1"+1   //11,string
let s2 = 1+"1"   //11,string
let s3 = "1"+1-1 //10,number
let s4 = "1"+1-"1" //10,number

引用数据类型更新在下一篇文章。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值