修改于2019/3/3:
https://biaoyansu.com/12.14
增加整数的判断方式Number.isInteger()、整数的转换parseInteger()、浮点数的转化parseFloat()、快速转化
string数据类型的一些操作函数
null和undefined做了一点修改
一提到JS的数据类型,好像大家都会讲六个数据类型:
num、string、boolean、object、undefined、null,还有近期频繁出现的一个神秘的第七个数据类型:symbol。
今天我想把数据类型相关的我已经了解到的东西整理一下,一是为了对知识进行归纳和整合,二是备份。
我想把这部分分为几个部分:
这篇博客主要讲第一部分和第二部分。
这一部分主要参考W3School:http://www.w3school.com.cn/js/js_datatypes.asp
廖雪峰老师的网站:https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434499190108eec0bdf14e704a09935cd112e501e31a000
还有一些优秀的博客:
https://www.cnblogs.com/phillyx/p/5603738.html https://www.cnblogs.com/chenpingzhao/p/4888787.html
在ECMAScript 5.1的标准中,JS有6种基本的数据类型:string、num、boolean、null、undefined、object。
(1)num
JavaScript不区分整数和浮点数,统一用Number表示,以下都是合法的Number类型:
123; // 整数123
0.456; // 浮点数0.456
1.2345e3; // 科学计数法表示1.2345x1000,等同于1234.5
-99; // 负数
NaN; // NaN表示Not a Number,当无法计算结果时用NaN表示
Infinity; // Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时,就表示为Infinity
num可以使用四则运算。注意一些运算结果:
2 / 0; // Infinity
0 / 0; // NaN
NaN的检测函数:(NaN与其他任何数都不相等)
isNaN(待检测对象)。如果是待检测对象是NaN,则返回true,否则返回false.
为true的情况只有如下几种:
Number.isNaN(NaN); // true
Number.isNaN(Number.NaN); // true
Number.isNaN(0 / 0) // true
以及NaN不等于NaN
整数
判断是否为整数:
Number.isInteger(1);//true
Number.isInteger(1.1);//false
其他类型转整型
parseInt('1') // 1
parseInt('1.1') // 1
parseInt('1.9') // 1
parseInt('1a') // 1注意字符串的只取开头整数
parseInt('a1') // NaN
parseInt('.9') // NaN
parseInt('0.9') // 0
用于条件语句判断时,0为false,其他都为true
!!0 // false
!!1 // true
!!0.1 // true
!!-1 // true
浮点数
转型:
parseFloat('1') // 1
parseFloat('1.0') // 1
parseFloat('1.1') // 1.1
parseFloat('1.1a') // 1.1
parseFloat('a1.1') // NaN
parseFloat('.1') // 0.1
快速转换
在其他类型前加上“+”可将其转化为number类型。
+'1' // 1
+'' // 0
+'1.1' // 1.1
+true // 1
+false // 0
(2)boolean
和其他的语言一样,JS的布尔类型也有两个取值:true和false。但是和一些语言,例如C/C++不一样的是,JS的布尔值只能取true或者false,不能用1或者0来代替。
boolean的创建则是最好使用Boolean()函数来创建。
如果用new Boolean()方法来创建,则创建的是一个值为true或者false的对象。具体值的确定如下:
数据类型 | true | false |
---|---|---|
Boolean | true | false |
String | 任何非空的字符串 | “” |
Number | 任何非0数值(包括无穷大) | 0和NAN |
Object | 任何对象 | null |
Undefined | 不适用 | undefined |
//false
var bNoParam = new Boolean();
var bZero = new Boolean(0);
var bNull = new Boolean(null);
var bEmptyString = new Boolean("");
var bfalse = new Boolean(false);
//true
var btrue = new Boolean(true);
var btrueString = new Boolean("true");
var bfalseString = new Boolean("false");
var bSuLin = new Boolean("aaa");
同时,可以使用“!!”将一个对象强制转换为true or false。
var test=!!o.flag;//等效于var test=o.flag||false;
但是,如果使用常见的true or false的检测方法,则会出现错误哦。
var x = new Boolean(false);
if(x){
console.log(x.valueOf(),typeof x); // false object
}
这段代码会被执行。因为检测的是x是否存在,作为一个object,它当然是存在的。
(3)string
字符串是以单引号’或双引号"括起来的任意文本,比如’abc’,"xyz"等等。请注意,单引号或者双引号本身只是一种表示方式,不是字符串的一部分,因此,字符串’abc’只有a,b,c这3个字符。
string的创建方式
var str1 = "javascript"; //typeof str1 == string
var str2 = String("javascript"); //typeof str2 == string 不推荐
var str3 = new String('javascript'); //typeof str3 == object
string和new String()的区别:
s1 = "2 + 2"; // creates a string primitive
s2 = new String("2 + 2"); // creates a String object
console.log(eval(s1)); // returns the number 4
console.log(eval(s2)); // returns the string "2 + 2"
也就是说使用对象的时候,string不会做类型转换。
此时如果想要执行string中的代码,则需要利用eval方法。
console.log(eval(s2.valueOf())); // returns the number 4
常用方法:
获取字符串中的字符
//第一种方式:charAt(下标)函数
“abc”.charAt(0);//"a"
//第二种方式,直接当成数组,取下标
"abc"[0];//"a"
检查a字符串是否包含b字符串
'花花你好'.includes('花花'); // true
'花花你好'.includes('不啊'); // false
字符串分割
'花花→_→拴蛋→_→背背'.split('→_→'); // ["花花", "拴蛋", "背背"]
连接字符串
'y'.concat('ooo', 'oo', 'o'); // "yoooooo",依次连接传入的字符,传参数量不限
截取字符串
var str = '王花花和小熊跳舞跳呀跳呀一二一';
str.slice(3, 8); // "和小熊跳舞",第一个传参为开始索引,第二个传参为结束索引
str.slice(3); // "和小熊跳舞跳呀跳呀一二一",若省略第二个传参将会截取至最后一个字符
移除两头空格
' yo '.trim(); // "yo"
' yo'.trim(); // "yo"
(4)null
null是一个字面量,不是全局对象的一个属性。从逻辑角度来看,null值表示一个空对象指针,而这也正是使用typeof操作符检测null时会返回object的原因。
当我们创建了一个对象,想要保存这个对象,但是暂时不需要给他赋值的时候,就需要给它赋一个初值null。(null必须手动赋值,JS自己不会赋值)
如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null而不是其他值。这样一来,只要直接检测null值就可以知道相应的变量是否已经保存了一个对象的引用了。
例如:
if(car != null){
//对car对象执行某些操作
}
null是false
(5)undefined
Undefined类型只有一个值,即特殊的undefined。在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined。与null不同,undefined是一个全局对象的属性。可以通过window.undefined来访问。
一个未初始化的变量的值为undefined,一个没有传入实参的形参变量的值为undefined,如果一个函数什么都不返回,则该函数默认返回undefined.
你可以使用严格相等运算符来判断一个值是否是undefined:
var foo;
console.log(foo === undefined);//true
console.log(typeof foo === 'undefined');//true
console.log(window.foo === undefined);//true
console.log(bar === undefined);//Uncaught ReferenceError: bar is not defined
console.log(typeof bar === 'undefined');//true
console.log(window.bar === undefined);//true
null和undefined的区别
console.log(foot);//Uncaught ReferenceError: foot is not defined
var foo;
console.log(foo);//undefined
var bar =null;
console.log(bar);//null
typeof null // object (bug in ECMAScript, should be null)
typeof undefined // undefined
null === undefined // false
null == undefined // true
undefined也是假
(6)object
JS中一切皆可对象。object其实就是一组无序数据对。
var person = {
name: 'Bob',
age: 20,
tags: ['js', 'web', 'mobile'],
city: 'Beijing',
hasCar: true,
zipcode: null
};
object的相关我现在还没有理得很清楚。后续会有专门的博客来写object。
这一部分参考
https://www.cnblogs.com/CandyManPing/p/5386767.html
首先我们需要知道,在ECMAScript标准中,JS的数据类型分为两大类:基本数据类型、引用数据类型。
其中基本数据类型保存在栈中,引用数据类型保存在栈中。Number、String、Boolean、Null、 Undefined、Symbol都属于基本类型。
引用数据类型保存在堆内存中。意思是,变量中保存的实际上只是一个指针,这个指针指向内存堆中实际的值。Object、Array和Function则属于引用类型。
引用数据类型:
(1)object
创建一个object有两种方式:
一是new一个object对象
var person = new Object();
//然后创建这个对象的不同属性并赋值
person.name = "abc";
person.age = 11;
也可以直接通过对象字面量表示法来进行创建
var person = {
name:"abc";
age:11;
}
(2) Array
JS中的数组的特殊之处在于,数组内的每一个元素的数据类型都可以不一样。
var person = new Array("aaa",11);
(3) Function
两种定义方式:
//1
function a(){
return 1;
}
//2
var sum = function(){
return 1;
}