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

《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的值
Boolean true false
Undefined N/A undefined
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

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

JavaScript高级程序设计--数据类型(1)相关推荐

  1. 《JavaScript高级程序设计(第3版)》教程大纲

    词条 <JavaScript高级程序设计>是2006年人民邮电出版社出版的图书,作者是(美)(Nicholas C.Zakas)扎卡斯.本书适合有一定编程经验的开发人员阅读,也可作为高校相 ...

  2. 前端红宝书《JavaScript高级程序设计》核心知识总结

    此文是对<JavaScript 高级程序设计>一书难点的总结,也是笔者在看了 3 遍之后的一些梳理和感想,希望能借此巩固js的基础和对一些核心概念有更深入的了解. 摘要 JS基本的数据类型 ...

  3. 《JavaScript高级程序设计》(第2版)上市

      本书是技术畅销书<JavaScript高级程序设计> 的第2版,几乎全部更新.重写 了上一版的内容,融入了作者近几年来奋战在前端开发一线的宝贵经验 , 是学习和提高JavaScript ...

  4. javascript高级程序设计pdf_一个老牌程序员推荐的JavaScript的书籍,看了真的不后悔!...

    很多人问我怎么学前端?我的回答是:读书吧!相对于在网上学习,在项目中学习和跟着有经验的同事学习,书中有着相对完整的知识体系,每读一本好书都会带来一次全面的提高.而如果深一脚浅一脚的学习,写出代码的质量 ...

  5. JavaScript高级程序设计之基本概念篇

    日子天天过,啥都能忘,学习不能忘.<JavaScript高级程序设计>这本书之前看过,但是只看了js的部分,其余部分并没有看.当时想,看看js部分应该够用了,但最近看了篇文章,受到了很深的 ...

  6. 读书笔记(06) - 语法基础 - JavaScript高级程序设计

    写在开头 本篇是小红书笔记的第六篇,也许你会奇怪第六篇笔记才写语法基础,笔者是不是穿越了. 答案当然是没有,笔者在此分享自己的阅读心得,不少人翻书都是从头开始,结果永远就只在前几章. 对此,笔者换了随 ...

  7. javascript 高级程序设计_重读《JavaScript高级程序设计》

    最近自己在休假,打算闭门几天将<JavaScript高级程序设计>(第3版)这本良心教材再回顾一遍.目前自己进入前端领域两年多,现在重读并记录下这本教材的"硬"知识点 ...

  8. javascript高级程序设计学习之数值转换 |Number(),parseInt(),parseFloat()

    2019独角兽企业重金招聘Python工程师标准>>> 将非数值转换成数值的函数有三个:Number(),parseInt(),parseFloat(); 小记tip:Number( ...

  9. 《JavaScript高级程序设计》红宝书第二遍阅读(动手实践)

    <JavaScript高级程序设计>红宝书第二遍阅读(动手实践) 第1章--什么是JavaScript 第2章--HTML中的JavaScript 第3章--语言基础 第4章--变量.作用 ...

最新文章

  1. Oracle数据库查看表空间是否为自增的
  2. 接口测试用例测试模板
  3. 导师:学生的第一篇SCI论文,把我看哭了!
  4. 高压发生器的输出电压波形
  5. Android监听应用程序安装和卸载
  6. myeclipse mysql连接_MyEclipse连接MySQL数据库图文教程
  7. java_函数的重载
  8. 腾讯云AI应用产品总监王磊:AI 在传统产业的最佳实践
  9. Lecture 21 Parallel Algorithms II
  10. u-boot,linux,文件系统移植笔记1
  11. 没有调用save或update方法,却有sql语句执行
  12. 路径规划之图规划算法(图片版)
  13. java 模拟电梯_java实现的电梯模拟系统
  14. 用python做炒股软件-python通达信接口_基于python的炒股软件
  15. stata输出相关系数表到word
  16. java程序设计 论文,Java程序设计毕业论文
  17. 给定一个设备编号区间[start, end],包含4或18的编号都不能使用,如:418、148、718不能使用,108可用
  18. 基于yolov5的目标检测火龙果
  19. 多说高级应用-添加 UA 浏览器标识、旋转头像等
  20. Android 内存检测工具

热门文章

  1. linux内核sock_sendmsg,为什么linux中sendto函数中的msg.msg_iovlen=1;
  2. 什么是视觉动力 ​——工业设计与视觉动力
  3. Ubantu20.04使用gcc9.3.0安装Nvidia显卡驱动遇到的问题
  4. 悄悄分享 60 个相见恨晚的神器工具
  5. 简单工厂模式 - Unity
  6. php习题,PHP程序设计试题与答案
  7. java基于ssm空气质量检测系统源码网站空气质量监测源码
  8. include and extend
  9. 第一章计算机网络概述
  10. 数据库系统、数据库、数据库管理系统简介,MySQL等服务器的比较