JavaScript的数据类型
基本数据类型
字符串(String)、数字 (Number)、布尔 (Boolean)、空值(Null)、未定义(Undefined)、唯一值(Symbol)、BigInt。
注意:Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值。BigInt也是新增数据类型。
引用数据类型
对象 (Object)
注意:
1.数组 (Array)和函数(Function) 都是对象来的。
2.typeof 函数(Function) 得到的结果是function,所以有些时候引用数据类型被当作Object和Function
基本数据类型存放在栈(stack)中,引用数据类型存放在堆(heap)中。
js 的变量数据类型是只有程序在运行过程中,根据等号右边的值来确定的,变量的数据类型是可以变化的。
数字型
JavaScript 数字类型既可以保存整数,也可以保存小数(浮点数)。
浮点数运算是不准确的,尽量避免浮点数相等比较。
- 在JS中八进制前面加0,十六进制前面加 0x
// 1.八进制数字序列范围:0~7
var num1 = 07; // 对应十进制的7
var num2 = 019; // 对应十进制的19
var num3 = 08; // 对应十进制的8
// 2.十六进制数字序列范围:0~9以及A~F
var num = 0xA;
- 数字型范围
最大值:Number.MAX_VALUE,这个值为: 1.7976931348623157e+308
最小值:Number.MIN_VALUE,这个值为:5e-32
(e表示乘以10,e后面的数字表示次方) - 数字型三个特殊值
Infinity ,代表无穷大,大于任何数值
-Infinity ,代表无穷小,小于任何数值
NaN ,Not a number,代表一个非数值
注意:NaN和NaN是不相等的。(将Not a number理解成一个非数字的集合,既然是集合那里面就有很多非数字的元素啦,而NaN是表示非数字集合中的其中某一个元素,比如是’a’;而另一个NaN又是另一个非数字元素,比如是’b’;那么判断NaN==NaN,相当于判断’a’== ‘b’,它们就不相等了。)
if(NaN==NaN) // false
- isNaN
用来判断一个变量是否为非数字的类型,返回 true 或者 false
var usrAge = 21;
var isOk = isNaN(userAge);
console.log(isOk); // false ,21 不是一个非数字
var usrName = "andy";
console.log(isNaN(userName));// true ,"andy"是一个非数字
- 转换成 保留几位小数 的形式
Number对象中的toFixed( )方法可以将数值转换成保留几位小数的形式,但是它的返回值变成字符串类型。它会将原来的数进行四舍五入截取,而且也是有 点5 不准确问题的
// toFixed 接收一个参数表示需要保留的位数,最多可以保留20位小数
console.log(Number(1.335).toFixed(2)); // 1.33
- 把数字格式化为指定的长度
Number对象中的toPrecision( )方法可以将数值格式化为指定的长度,返回值是一个格式化好的字符串。如果原来数值的整数部分已经大于指定长度,那么会用科学计数法表示,多出部分四舍五入。如果原来数值的整数部分小于指定长度,会继续保留小数部分,小数多出部分四舍五入,小数不足的话就补零。(不准确)
console.log(Number(1.335).toPrecision(20)); // "1.3349999999999999645"
字符串型
双引号或者单引号包围内容,因为 HTML 标签里面的属性使用的是双引号,JS 中推荐使用单引号。
- 字符串转义符
转义符 | 解释说明 |
\n | 换行符,n 是 newline 的意思 |
\ \ | 斜杠 \ |
’ | ’ 单引号 |
" | ”双引号 |
\t | tab 缩进 |
\b | 空格 ,b 是 blank 的意思 |
- 字符串长度
通过length属性获取 - 字符串拼接
多个字符串之间可以使用 + 进行拼接,其拼接方式为 字符串 + 任何类型 = 拼接之后的新字符串
拼接前会把与字符串相加的任何类型转成字符串,再拼接成一个新的字符串
布尔型
布尔类型有两个值:true 和 false ,其中 true 表示真(对),而 false 表示假(错)。
布尔型和数字型相加的时候, true 的值为 1 ,false 的值为 0。
console.log(true + 1); // 2
console.log(false + 1); // 1
Undefined
Undefined类型中只有一个值,就是undefined
undefined没有指针,没有占位符。undefined的值是派生自null的,undefined可以当作关键字。
undefined会在以下情况中出现:
- 一个声明后没有被赋值的变量会有一个默认值undefined ( 如果进行相连或者相加时,注意结果)
- 获取一个对象上不存在的属性或者方法
- 获取一个数组中没有被赋值的元素
var variable;
console.log(variable); // undefined
console.log('你好' + variable); // 你好undefined
console.log(11 + variable); // NaN 标记一下,这条要记得
console.log(true + variable); // NaN
console.log(undefined == null); // true
console.log(undefined === null); // false
Null
null是空指针,有个占位符。
一个声明变量给 null 值,表示里面存的值为空(学习对象时,我们继续研究null),算术运算中null 的值为 0
var vari = null;
console.log('你好' + vari); // 你好null
console.log(11 + vari); // 11 标记一下,这条要记得,不是输出NAN,而是11
console.log(true + vari); // 1
检测变量属于哪种数据类型的方法
typeof 可用来获取检测变量的数据类型,它返回值是一个字符串
var num = 18;
console.log(typeof num) // 结果 number
console.log(typeof num []) // 结果 object
console.log(typeof num null) // 结果 object
严格检查变量类型
Object.prototype.toString.call(data); //data是要检测的变量
instanceof 用来断言变量是否属于某个类型,在判断类的继承中不是很严谨。
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
const auto = new Car('Honda', 'Accord', 1998);
console.log(auto instanceof Car); // true
console.log(auto instanceof Object); // true
通过 constructor 属性返回其 JavaScript 变量的构造函数来断言类型
false.constructor // 返回函数 Boolean() { [native code] }
[1,2,3,4].constructor // 返回函数 Array() { [native code] }
/*比如判断是否为数组*/
function isArray(myArray) {
return myArray.constructor.toString().indexOf("Array") > -1;
}
数据类型转换
- 转换为字符串
注意:
toString() 和 String() 使用方式不一样。
三种转换方式,更多第三种加号拼接字符串转换方式, 这一种方式也称之为隐式转换。 - 转换为数字型
使用一元运算符 + 来转换
var y = "5"; // y 是一个字符串
var x = + y; // x 是一个数字
也可以使用下面的方法来转换
注意:
parseInt 和 parseFloat 单词的大小写,这2个是重点
隐式转换是我们在进行算数运算的时候,JS 自动转换了数据类型
- 转换为布尔型
注意:
代表空、否定的值会被转换为 false ,如 ‘’、0、NaN、null、undefined
其余值都会被转换为 true
console.log(Boolean('')); // false
console.log(Boolean(0)); // false
console.log(Boolean(NaN)); // false
console.log(Boolean(null)); // false
console.log(Boolean(undefined)); // false
console.log(Boolean('小白')); // true
console.log(Boolean(12)); // true
JavaScript变量
变量就是存放数据的容器。在 JavaScript 中,对象和函数同样也是变量。
变量的本质就是内存里的一块空间,声明变量本质就是去内存申请空间。
var 是一个 JS关键字,用来声明变量( variable 变量的意思 )。使用该关键字声明变量后,计算机会自动为变量分配内存空间,不需要程序员管理。
变量名字最好不要叫name,name在有些浏览器当中是关键字的。
变量的初始化
var a=18; // 正常声明变量和初始化
var a1=0,a2=1; //同时声明多个变量,可以用逗号隔开
var b; // b的值是undefined
var c,d=2; // c是undefined,d是2
var e=f=3; // e和f都是3,相当于 var e=3; f=3; 注意这种写法只有第一个变量是有关键字声明的
var g=4;
var g; //再次声明同一个名字的变量但是不赋值,g还是4
var h=5;
var h=6; //再次声明同一个名字的变量而且赋值,h变成6
i=7; // 未声明就直接使用名字赋值,虽然不会报错但是不提倡这样做
j; // 未声明又未赋值直接使用变量,会报错
局部变量和全局变量
1.在 JavaScript 函数内部声明的变量(使用 var)是_局部_变量,所以只能在函数内部访问它。(该变量的作用域是局部的)。局部变量会在函数运行以后被删除。
2.在函数外声明的变量是_全局_变量,网页上的所有脚本和函数都能访问它。全局变量会在页面关闭后被删除。
3.如果您把值赋给尚未声明的变量,该变量将被自动作为 window 的一个属性。非严格模式下给未声明变量赋值创建的全局变量,是全局对象的可配置属性,可以删除。使用var声明的变量是不可删除的。
注意:
全局变量,或者函数,可以覆盖 window 对象的变量或者函数。
局部变量,包括 window 对象可以覆盖全局变量和函数。