引言
javascript
是一门前端必须达到精通程度的语言,为什么呢?javascript
如今不再仅仅用来实现网页动画和交互,由javascript
衍生出的产品开始涉及到后端,服务器等领域,所以它的强大足以使我们为之疯狂!
1.ECMAScript和JavaScript
简单来讲,
ECMAScript
是一种W3C标准,而JavaScript
是对此标准的一种实现。
2.数据类型
数据类型分为基本数据类型和引用数据类型
基本数据类型:
- number
- boolean
- null
- undefined
引用数据类型: - array
- function
- object
特殊(行为与基本类型相似的不可变引用类型): - string
3.数据类型一:number##
合法的number类型示例:
100; // 整数100
0.5; // 浮点数0.5
1.2e3; // 科学计数法表示1.2x1000,等同于1200
-1; // 负数
NaN; // NaN表示Not a Number,当无法计算结果时用NaN表示
Infinity; // Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时,就表示为Infinity
number四则运算示例:
1 + 2; // 3
(1 + 2) * 5 / 2; // 7.5
5 / 0; // Infinity
-5 / 0// -Infinity
Infinity / 0; // Infinity
-Infinity / 0; // -Infinity
0 / 0; // NaN
Infinity - 2; // Infinity
Infinity - Infinity; // NAN
Infinity / Infinity; // NAN
Infinity * Infinity; // Infinity
-Infinity * Infinity; // -Infinity
10 % 3; // 1
10.5 % 3; // 1.5
-10 % 3; // -1
-10.5 % 3; // -1.5
//注意:**NAN与任何number包括自己做运算都返回NAN**
注意:
a.对于NAN,与所有其他值都不相等,包括它自己。唯一能判断NaN的方法是通过isNaN()函数
NaN === NaN; // false
isNaN(NaN); // true
b.浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。要比较两个浮点数是否相等,只能计算它们之差的绝对值,看是否小于某个阈值。
1 / 3 === (1 - 2 / 3); // false
Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
4.数据类型二:string##
JavaScript 的字符串是不可变的(immutable),String 类定义的方法都不能改变字符串的内容,而是返回新的字符串。
字符:
'A',"a",'\n','\x##','\u####'
字符串:
'I\'m \"OK\"!'; // I'm "OK"!
'\u4e2d\u6587'; // 中文
ES6多行字符串:
`我是谁?
我来自哪里?
我在做什么?`;//‘\n’ is replaced
ES6模板字符串
var name = 'kingboss';
var age = 22;
var message = `你好, ${name}, 你今年${age}岁了!`;
alert(message);
//原始方法:‘+’连接符
操作字符串方法
- length //获取字符串长度
- charAt // 返回在指定位置的字符
- concat() // 连接字符串
- indexOf() // 检索字符串
- lastIndexOf() // 从后向前搜索字符串
- match() // 找到一个或多个正则表达式的匹配
- replace() // 替换与正则表达式匹配的子串
- slice(start,stop) // 提取字符串的片断,并在新的字符串中返回被提取的部分
- split() // 把字符串分割为字符串数组
- substr(start,length) // 提取字符串中start索引开始指定length个字符
- substring(start,stop) // 提取字符串中两个指定的索引号之间的字符
- toLowerCase() // 把字符串转换为小写
- toUpperCase() // 把字符串转换为大写
- toString() // 返回字符串
- valueOf() // 返回某个字符串对象的原始值
注意:substr和substring的区别在于参数负数的处理:当接收的参数是负数时,slice会将它字符串的长度与对应的负数相加,结果作为参数;substr则仅仅是将第一个参数与字符串长度相加后的结果作为第一个参数;substring则干脆将负参数都直接转换为0。
5.数据类型三:boolean##
boolean只有true和false两个值,下表是其他类型转换成boolean值对照:
数值类型 | 转换成boolean值 |
---|---|
undefined | false |
null | false |
boolean | true是true,false是false |
number | +0,-0和NAN是false,其他都是true |
string | 如果字符串是空的(长度是0)是false,其他是true |
object | true |
6.数据类型四:null和undefined##
null表示一个空的值,而undefined表示值未定义。使用上,没必要区分两者。大多数情况下,我们都应该用null。undefined仅仅在判断函数参数是否传递的情况下有用。
注意:typeof(null)=> object ; typeof(undefined)=> undefined
7.数据类型五:array##
a.创建和初始化数组
var array1 = new Array();
var array2 = new Array(7);
var array3 = new Array('Monday',2,true,'kingboss');
var array4 = [];
var array5 = ['Monday',2,true,'kingboss'];
b.访问数组和length
console.log(array5.length);
console.log(array5[4]);//undefined,length+1
c.添加和删除元素
var array = [0,1,2,3,4,5];
array[2] = 'tow'; // [0,1,'two',3,4,5]
array.push(6,7); // [0,1,'two',3,4,5,6,7]
array.pop(); // [0,1,'two',3,4,5,6]
array.unshift(-2,-1); // [-2,-1,0,1,'two',3,4,5,6]
array.shift(); // [-1,0,1,'two',3,4,5,6]
array.splice(2,3); // [-1,0,4,5,6]
array.splice(2,0,999,999); //[-1,0,999,999,4,5,6]
array.splice(2,2,88,88); // [-1,0,88,88,4,5,6]
array.slice(2,5); //返回[88,88,4],但是原数组array不变
array.concat(['a','b','c']); // 返回[-1, 0, 88, 88, 4, 5, 6, "a", "b", "c"],但是原数组array不变
array.reverse(); // [6, 5, 4, 88, 88, 0, -1]
array.sort(); // [-1, 0, 4, 5, 6, 88, 88]
array.join(''); // "-104568888"
8.数据类型六:object##
JavaScript 中的所有事物都是对象:字符串、数字、数组、日期,等等。在 JavaScript 中,对象是拥有属性和方法的数据。对象除了内置对象以外也可以自定义对象。
自定义对象:
var person={
firstname:"John",
lastname:"Doe",
age:50,
"eye-color":"blue"
};
person.firstname; // "John"
person["eye-color"]; // "blue"
person.age = 20; // person.age => 20
delete person.lastname; // person.lastname => undefined
"lastname" in person; // false
"toString" in person; // true
person.hasOwnProperty("toString"); //false
内置对象:
- Number
- String
- Date
- Array
- Boolean
- Math
- RegExp
- Function
注意:虽然说JavaScript 中的所有事物都是对象,但是object作为一种js数据类型,与其它number,boolean,string是不严格相等的。上代码:
new Number(2) === 2 // false
new String("haha") === "haha" // false
new Boolean(true) === true // false
如果不加new,Number(),String(),Boolean()则变成转换函数,此时与包装器函数不同,上面的例子就相等了,上代码:
Number("2") === 2 // true
String(100) === "100" //true
Boolean(0) === false // true
9.数据类型七:function##
由于function涉及内容比较广,我会单独写一篇博文
10.关于typeof()##
判定规则:
- 对于数字类型,返回number
- 对于字符串类型, typeof 返回的值是 string
- 对于布尔类型, typeof 返回的值是 boolean
- 对于对象、数组、null 返回的值是 object 。比如typeof(window),typeof(document),typeof(null)返回的值都是object
- 对于函数类型,返回的值是 function。比如:typeof(eval),typeof(Date)返回的值都是function。
- 如 果运算数是没有定义的(比如说不存在的变量、函数或者undefined),将返回undefined。比如:typeof(sss)、typeof(undefined)都返回undefined。
11.数据类型判定方法经验总结##
由于typeof()方法对于array,null,object都返回“object”,所以依靠typeof不能完全区分所有数据类型,所以才有以下经验,摘自廖雪峰的javascript教程,与大家分享。
- 不要使用new Number()、new Boolean()、new String()创建包装对象;
- 用parseInt()或parseFloat()来转换任意类型到number;
- 用String()来转换任意类型到string,或者直接调用某个对象的toString()方法;
- 通常不必把任意类型转换为boolean再判断,因为可以直接写if (myVar) {…};
- typeof操作符可以判断出number、boolean、string、function和undefined;
- 判断Array要使用Array.isArray(arr);
- 判断null请使用myVar === null;
- 判断某个全局变量是否存在用typeof window.myVar === ‘undefined’;
- 函数内部判断某个变量是否存在用typeof myVar === ‘undefined’。
任何对象都有toString()方法吗?null和undefined就没有!确实如此,这两个特殊值要除外,虽然null还伪装成了object类型。number对象调用toString()报SyntaxError:
123.toString(); // SyntaxError
遇到这种情况,要特殊处理一下:
123…toString(); // ‘123’, 注意是两个点!
(123).toString(); // ‘123’
结束语
学会总结也是程序员进步的法宝之一。作为一名前端仔,js的数据类型也许是最基本的,但是真要你系统地讲出来绝非易事。所以总结的同时也是提升自己的过程。