JavaScript高级程序设计--数据类型(1)
文章较长,建议收藏以便浏览
《JavaScript高级程序设计(第三版)》学习总结
在JavaScript中,数据类型分为基本数据类型和引用数据类型两中:
- 基本数据类型:string、number、boolean、null、undefined、Symbol(ES6新增)
- 引用数据类型:object、array、function
- 两种数据类型的区别:
- 基本数据类型是存在栈内存中的,按值访问;引用数据类型是存在堆内存中的,按地址访问。
Undefined类型
- Undefined类型只有一个特殊的值,即undefined,那么什么情况下为产生undefined呢?
- 一个变量声明了却没有被赋值(获取未声明的变量不会是undefined会报错)
var a console.log(a) // undefined console.log(b) // 报错:b is not defined
- 一个对象上不存在的属性或方法
var obj = {name: 'luffy' } console.log(obj.name) // luffy console.log(obj.age) // undefined
- 一个数组中没有被赋值的索引
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类型只有两个字面值:true和false(区分大小写,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类型,其它类型返回NaNparseFloat(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)相关推荐
- 《JavaScript高级程序设计(第3版)》教程大纲
词条 <JavaScript高级程序设计>是2006年人民邮电出版社出版的图书,作者是(美)(Nicholas C.Zakas)扎卡斯.本书适合有一定编程经验的开发人员阅读,也可作为高校相 ...
- 前端红宝书《JavaScript高级程序设计》核心知识总结
此文是对<JavaScript 高级程序设计>一书难点的总结,也是笔者在看了 3 遍之后的一些梳理和感想,希望能借此巩固js的基础和对一些核心概念有更深入的了解. 摘要 JS基本的数据类型 ...
- 《JavaScript高级程序设计》(第2版)上市
本书是技术畅销书<JavaScript高级程序设计> 的第2版,几乎全部更新.重写 了上一版的内容,融入了作者近几年来奋战在前端开发一线的宝贵经验 , 是学习和提高JavaScript ...
- javascript高级程序设计pdf_一个老牌程序员推荐的JavaScript的书籍,看了真的不后悔!...
很多人问我怎么学前端?我的回答是:读书吧!相对于在网上学习,在项目中学习和跟着有经验的同事学习,书中有着相对完整的知识体系,每读一本好书都会带来一次全面的提高.而如果深一脚浅一脚的学习,写出代码的质量 ...
- JavaScript高级程序设计之基本概念篇
日子天天过,啥都能忘,学习不能忘.<JavaScript高级程序设计>这本书之前看过,但是只看了js的部分,其余部分并没有看.当时想,看看js部分应该够用了,但最近看了篇文章,受到了很深的 ...
- 读书笔记(06) - 语法基础 - JavaScript高级程序设计
写在开头 本篇是小红书笔记的第六篇,也许你会奇怪第六篇笔记才写语法基础,笔者是不是穿越了. 答案当然是没有,笔者在此分享自己的阅读心得,不少人翻书都是从头开始,结果永远就只在前几章. 对此,笔者换了随 ...
- javascript 高级程序设计_重读《JavaScript高级程序设计》
最近自己在休假,打算闭门几天将<JavaScript高级程序设计>(第3版)这本良心教材再回顾一遍.目前自己进入前端领域两年多,现在重读并记录下这本教材的"硬"知识点 ...
- javascript高级程序设计学习之数值转换 |Number(),parseInt(),parseFloat()
2019独角兽企业重金招聘Python工程师标准>>> 将非数值转换成数值的函数有三个:Number(),parseInt(),parseFloat(); 小记tip:Number( ...
- 《JavaScript高级程序设计》红宝书第二遍阅读(动手实践)
<JavaScript高级程序设计>红宝书第二遍阅读(动手实践) 第1章--什么是JavaScript 第2章--HTML中的JavaScript 第3章--语言基础 第4章--变量.作用 ...
最新文章
- Oracle数据库查看表空间是否为自增的
- 接口测试用例测试模板
- 导师:学生的第一篇SCI论文,把我看哭了!
- 高压发生器的输出电压波形
- Android监听应用程序安装和卸载
- myeclipse mysql连接_MyEclipse连接MySQL数据库图文教程
- java_函数的重载
- 腾讯云AI应用产品总监王磊:AI 在传统产业的最佳实践
- Lecture 21 Parallel Algorithms II
- u-boot,linux,文件系统移植笔记1
- 没有调用save或update方法,却有sql语句执行
- 路径规划之图规划算法(图片版)
- java 模拟电梯_java实现的电梯模拟系统
- 用python做炒股软件-python通达信接口_基于python的炒股软件
- stata输出相关系数表到word
- java程序设计 论文,Java程序设计毕业论文
- 给定一个设备编号区间[start, end],包含4或18的编号都不能使用,如:418、148、718不能使用,108可用
- 基于yolov5的目标检测火龙果
- 多说高级应用-添加 UA 浏览器标识、旋转头像等
- Android 内存检测工具
热门文章
- linux内核sock_sendmsg,为什么linux中sendto函数中的msg.msg_iovlen=1;
- 什么是视觉动力 ​——工业设计与视觉动力
- Ubantu20.04使用gcc9.3.0安装Nvidia显卡驱动遇到的问题
- 悄悄分享 60 个相见恨晚的神器工具
- 简单工厂模式 - Unity
- php习题,PHP程序设计试题与答案
- java基于ssm空气质量检测系统源码网站空气质量监测源码
- include and extend
- 第一章计算机网络概述
- 数据库系统、数据库、数据库管理系统简介,MySQL等服务器的比较