重拾ECMAScript5基础——数据类型+操作符
2017-07-11 本文已影响0人
JacobMa1996
操作符
1.一元操作符
- 自增自减,同C语言
- 一元加、一元减
一元加,放在数值前,不进行任何操作,放在非数值前,类似与Number()转型函数;
一元减,将数值取负,对非数值进行Number()后再取负;
//一元加或减
var a = -10;
alert(+a);//-10
var b = 'b';
alert(+b);//NaN
var c = 10;
alert(-c);//-10
var d = '10';
alert(-d);//-10
2.位操作符
3.布尔操作符
- 逻辑非 !
首先将操作数转换成布尔值,再进行取反;
若同时用两个逻辑非,类似于Boolean()转型函数;
//双逻辑非
alert(!!'blue');//true
alert(!!NaN);//false
- 逻辑与 &&
属于短路操作;
若都为布尔值,则相与;
否则//逻辑与 //这里用und表示未定义的变量 console.log(null && und);//null console.log(undefined && und);//undefined console.log(NaN && und);//NaN console.log(new Object() && true);//true console.log(true && new Object());//Object {} console.log(new Object() && new Object());//Object {} 第二个
- 逻辑或 ||
与逻辑与操作相似;//逻辑或 //这里也用und表示未定义的变量 console.log(new Object() || und);//Object {} console.log(false || true);//true console.log(new Object() || new Object());//Object {} 第一个 console.log(null || null);//null console.log(NaN || NaN);//NaN console.log(undefined || undefined);//undefined
4.乘性操作符
若为数值,正常计算,若有操作数不是数值,则在后台调用转换成数值,再应用下面规则
//*
console.log(NaN * 1);//NaN
console.log(Infinity * 0);//NaN
console.log(Infinity * 1);//Infinity
console.log(Infinity * Infinity);//Infinity
///
console.log(NaN / NaN);//NaN
console.log(Infinity / Infinity);//NaN
console.log(0 / 0);//NaN
console.log(1 / 0);//Infinity
console.log(Infinity / 1);//Infinity
//%
console.log(Infinity % 1);//NaN
console.log(1 % 0);//NaN
console.log(Infinity % Infinity);//NaN
console.log(1 % Infinity);//1
console.log(0 % 1);//0 只要被除数为0
5.加性操作符
若为数值,则相加;
若为非数值,则:
//+
console.log(1 + 2);//3
console.log(NaN + 1);//NaN
console.log(+0 + +0);//+0
console.log(-0 + -0);//-0
console.log(+0 + -0);//+0
console.log(Infinity + Infinity);//Infinity
console.log(-Infinity + -Infinity);//-Infinity
console.log(+Infinity + -Infinity);//NaN
console.log(5 + '5');//'55'
console.log('abc' + 'd');//abcd
console.log('abc' + new Object());//abc[object Object]
console.log('abc' + new Boolean(true));//abctrue
console.log('abc' + undefined);//abcundefined
console.log('abc' + null);//abcnull
//-
console.log(2 - 1);//1
console.log(NaN - 1);//NaN
console.log(Infinity - Infinity);//NaN
console.log(-Infinity - -Infinity);//NaN
console.log(Infinity - -Infinity);//Infinity
console.log(-Infinity - Infinity);//-Infinity
console.log(+0 - +0);//+0
console.log(+0 - -0);//+0 有出入
console.log(-0 - -0);//+0
console.log('a' - 1);//NaN
console.log(new Boolean(true) - 1);//0
console.log(null - 1);//-1
console.log(undefined - 1);//NaN
6.关系操作符
先转换为数值,后比较;
若为对象,则调用vauleOf()方法,若没有,则调用toString()方法,后比较;
//> < >= <=
console.log(3 > 2);//true
console.log('b' > 'A');//true 比较其对应的字符编码(ASCII码)
console.log('23' < '3');//true 因为是字符串,比较字符编码
console.log('a' < 3);//false 将'a'转换成了NaN
console.log(NaN > 1);//false
7.相等操作符
==,===
先强制转换操作数为数值,再进行比较;
//相等操作符
console.log(null == undefined);//true
console.log(null == 0);//false
console.log(undefined == 0);//false
console.log(NaN == NaN);//false
console.log(false == 0);//true
console.log('5' == 5);//true
console.log(new Object() == 1);//false
var obj = new Object();
console.log(new Object() == new Object());//false
console.log(obj == obj);//true
8.条件操作符
即三元表达式
//条件操作符
var num1 = 1,num2 = 2;
var max = (num1 > num2) ? num1 : num2;
console.log(max);//2
9.赋值操作符
略
10.逗号操作符
可以在一条语句中执行多个操作
var num1 = 1, num2 = 2, num3 = 3;
var num = (5, 1, 4, 8, 0);
console.log(num);//0
数据类型
1.Undefined
undefined,声明的变量未初始化,但尚未定义的变量会报错;
//Undefined
var message;
alert(message);//'undefined'
alert(age);//ReferenceError
2.NULL
null,表示一个空对象指针(typeof null返回'object'),如果定义的变量在将来用来保存对象,最好初始化为null;
undefined值派生自null,出自比较目的会typeof会转换操作数使得:
//Null
var car = null;
alert(typeof car);//'object'
alert(null == undefined);//true
3.Boolean
true和false,区分大小写,所有类型值都可以转换为布尔值;
//String
console.log(Boolean('abc'));//true
console.log(Boolean(''));//false
//Number
console.log(Boolean(1));//true
console.log(Boolean(Infinity));//true
console.log(Boolean(0));//false
console.log(Boolean(NaN));//false
//Object
console.log(Boolean(new Object()));//true
console.log(Boolean(null));//false
//Undefiend
console.log(Boolean(undefined));//false
基本包装类型扩展:最好永远不要使用Boolean();
4.Number
- 整数和浮点数,八进制,十六进制;
//浮点数
console.log(1.1);//1.1
console.log(1.);//1
console.log(.1);//0.1
console.log(3.125e7);//31250000
//八进制与十六进制
console.log(070);//56
console.log(0xA);//10
- 数值范围;
//数值范围
console.log(Number.MAX_VALUE);//1.7976931348623157e+308
console.log(Number.MIN_VALUE);//5e-324
console.log(isFinite(Number.MAX_VALUE + 0.1e+308));//false 注:超出范围不多时显示true
console.log(isFinite(NaN));//false
- NaN(Not a Number),是一个特殊的数值,表示非数值;
任何涉及NaN的运算,都会返回NaN;
NaN与任何值都不相等,包括它本身;
console.log(NaN == NaN);//false
isNaN(),能转换成数值的参数返回false,NaN和不能转换成数值的参数返回true;
//isNaN
console.log(isNaN('a'));//true
//对于对象,依次调用valueOf()和toString()方法;
- 数值转换
Number(),parseInt(),parseFloat();
//Number
console.log(Number('hello world'));//NaN
console.log(Number(''));//0
console.log(Number('00011'));//11
console.log(Number(true));//1
//对于对象,依次调用valueOf()和toString()方法;
//parseInt()
console.log(parseInt('a123'));//NaN
console.log(parseInt('123a'));//123
console.log(parseInt(''));//NaN
console.log(parseInt(22.5));//22
console.log(parseInt(0xA));//10
console.log(parseInt('AF',16));//175
console.log(parseInt('10',2));//2
//parseFloat()
console.log(parseFloat('0xA'));//NaN
console.log(parseFloat('22.5'));//22.5
基本包装类型扩展:
Number();
toFixed(),toExponential(),格式化为字符串了;
//基本包装类型
var num1 = 10.005;
var num2 = 10;
console.log(num1.toFixed(2));//'10.01'
console.log(num2.toFixed(2));//'10.00'
console.log(num2.toExponential(1));//'1.0e+1'
5.String
字符串,用于表示由0或多个16位Unicode字符组成的字符序列;
在ES中,双引号与单引号表示的字符串完全相同;
- 转义字符
\n换行 \t制表 \b退格 \r回车 \f进纸 \\斜杠 '单引号 "双引号 \xnn \unnnn
//转义字符
console.log('1\n2');//1(换行)2
console.log('\u03a0');//Π(希腊字符)
- 字符串的特点
ES中变量保存的字符串的值的改变,是先销毁,然后在后台重新分配长度,再重新定义的; - 转换为字符串
String()函数调用值的toString()方法,若为null和undefined,则返回'null'和'undefined';
//转换为字符串
var num = 10;
console.log(num.toString());//'10'
console.log(num.toString(2));//'1010'
console.log(num.toString(8));//'12'
console.log(num.toString(10));//'10'
console.log(num.toString(16));//'a'
基本包装类型扩展:
1.字符方法
//字符方法 charAt charCodeAt
var str = 'hello world';
console.log(str.charAt(1));//e
console.log(str.charCodeAt(1));//101
console.log(str[1]);//e
2.字符串的操作方法
//slice,substr,substring 返回子字符串
console.log(str.slice(3));//'lo world'
console.log(str.substring(3));//'lo world'
console.log(str.substr(3));//'lo world'
console.log(str.slice(3,7));//'lo w'
console.log(str.slice(3,7));//'lo w'
console.log(str.substring(3,7));//'lo w'
console.log(str.substr(3,7));//'lo worl'
console.log(str.slice(-3));//'rld'
console.log(str.substring(-3));//'hello world'
console.log(str.substr(-3));//'rld'
console.log(str.slice(3,-4));//'lo w'
console.log(str.substring(3,-4));//'hel' 即substring(0,3)
console.log(str.substr(3,-4));//'' 即substr(3,0)
3.字符串的位置
//字符串的位置
console.log(str.indexOf('o'));//4
console.log(str.lastIndexOf('o'));//7
console.log(str.indexOf('o',6));//7
console.log(str.lastIndexOf('o',6));//4
4.trim()
//trim()
var str3 = ' hello world ';
console.log(str3.trim());//hello world
5.大小写的转换
//大小写转换
var str4 = 'HELLO world';
console.log(str4.toUpperCase());//'HELLO WORLD'
console.log(str4.toLocaleUpperCase());//'HELLO WORLD' 针对地区的方法(更稳妥)
console.log(str4.toLowerCase());//'hello world'
console.log(str4.toLocaleLowerCase());//'hello world'
6.字符串的模式匹配
//字符串的模式匹配
var text = 'cat,bat,sat,fat';
var pattern = /.at/;
console.log(text.match(pattern)[0]);//'cat' match返回一个数组
console.log(text.search(/at/));
console.log(text.replace('at','ond'));//'cond,bat,sat,fat'
console.log(text.replace(/at/g,'ond'));//'cond,bond,sond,fond'
//特殊字符序列 $n 匹配第n个捕获组的子字符串?
console.log(text.replace(/(.at)/g,'word($1)'));//'word(cat),word(bat),word(sat),word(fat)'
//replace第二个参数为函数 转义函数
var text2 = '<p class="greeting">hello world</p>';
console.log(text2.replace(/[<>"&]/g,function(match,pos,originalText){
switch(match) {
case '<' : return '<';
case '>' : return '>';
case '&' : return '&';
case '\"' : return '"';
}
}));
//<p class="greeting">hello world</p>
//split()
var color = 'red,blue,green,yellow';
console.log(color.split(','));//["red", "blue", "green", "yellow"]
console.log(color.split(',',2));//["red", "blue"]
console.log(color.split(/[^\,]+/));//["", ",", ",", ",", ""] 注:分隔符为除逗号以外的字符
7.localeCompare()
//localeCompare() 比较字符串在字母表中的排列顺序
var str5 = 'yellow';
console.log(str5.localeCompare('brick'));//1
console.log(str5.localeCompare('yellow'));//0
console.log(str5.localeCompare('zoo'));//-1
8.fromCharCode()
//fromCharCode() String的方法 接收字符编码,转换成一个字符串
console.log(String.fromCharCode(104,101,108,108,111));//'hello'
9.HTML方法
尽量不使用
6.Object
ECMA-262 把对象(object)定义为“属性的无序集合,每个属性存放一个原始值、对象或函数”。
Object是ECMAScript中所有对象的基础,是一种引用类型,引用类型是对象定义(类);
var obj = new Object();
console.log(obj.constructor);//构造函数
console.log(obj.hasOwnProperty(propertyName));//检查属性是否在当前实例中
console.log(obj.isPrototypeOf(object));//检查传入对象是否是当前对象的原型
console.log(obj.propertyIsEnumerable(propertyName));//检查属性是否可枚举
console.log(obj.toLocaleString());//
console.log(obj.toString());//
console.log(obj.valueOf());//
//示例如下
function NewObj () {
this.name = 'newObj';
}
var newObj = new NewObj();
console.log(newObj);//NewObj {name: "newObj"}
console.log(NewObj);//function NewObj() {this.name = 'newObj';}
console.log(newObj.constructor);//function NewObj() {this.name = 'newObj';}
console.log(newObj.hasOwnProperty('name'));//true
console.log(NewObj.prototype);//Object {constructor: function}
console.log(NewObj.prototype.isPrototypeOf(newObj));//true
console.log(newObj.prototype);//undefined
console.log(newObj.__proto__);//Object {constructor: function}