值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol。
引用数据类型:对象(Object)、数组(Array)、函数(Function)。
alert( 1 / 0 ); // Infinity
alert( Infinity ); // Infinity
alert( NaN === NaN ); // false
let billion = 1e9;
let a = 6;
console.log(billion);//1000000000
let b = Number(`2e${a}`);
console.log(b);//2000000
let ms = 1e-6;
console.log(ms);//0.000001
..
直接在一个数字上调用一个方法alert( 123456..toString(36) ); // 2n9c
let num = 12.34;
alert( num.toFixed(1) ); // "12.3"
返回的是一个字符串
alert(0.1 + 0.2);//0.30000000000000004
在项目中是不允许的,那么怎么办呢??
let sum = 0.1 + 0.2;
alert( sum.toFixed(2) ); // 0.30
请注意 toFixed 总是返回一个字符串。它确保它在小数点后有 2 位数字。如果我们有电子购物并需要显示 0.30 美元,这实际上很方便。对于其他情况,我们可以使用一元加号将它强制为一个数字:
let sum = 0.1 + 0.2;
alert( +sum.toFixed(2) ); // 0.3
alert( (0.1 * 10 + 0.2 * 10) / 10 ); // 0.3
Object.is(a,b) 与 a === b
相同
let a = 1;
let obj= {
b: 1,
}
alert(Object.is(a, obj.b));
alert(a === obj.b)//true
+
或 Number()
的数字转换是严格的。如果一个值不完全是一个数字,就会失败:alert( +"100px" ); // NaN
alert(+"100px");//NaN
alert(parseInt("100px"));//100
alert(typeof parseInt("100px"));//number
alert(parseInt("12.5em"))//12
alert(parseFloat("12.5em"))//12.5
alert( Number(" 123 ") ); // 123
alert( Number("123z") ); // NaN(从字符串“读取”数字,读到 "z" 时出现错误)
alert( Number(true) ); // 1
alert( Number(false) ); // 0
let str = "Hello";
let str2 = 'Single quotes are ok too';
let phrase = `can embed ${str}`;
slice 稍微灵活一些,它允许以负值作为参数并且写法更简短。因此仅仅记住这三种方法中的 slice 就足够了。
let str = "As sly as a fox, as strong as an ox";
alert(str.slice(4,-4));//ly as a fox, as strong as a
调用 str.localeCompare(str2)
会根据语言规则返回一个整数。
let str = "Österreich";
let str2 = "ahaha";
alert(str.localeCompare(str2));//1
let str = '';
for(var i = 65; i < 220; i ++){
str += String.fromCodePoint(i);
}
console.log(str);
//ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
//€‚ƒ„
//†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛ
可以显式地调用 String(value)
来将 value
转换为字符串类型:
let value = true;
alert(typeof value); // boolean
value = String(value); // 现在,值是一个字符串形式的 "true"
alert(typeof value); // string
true
和false
两个值alert( Boolean(1) ); // true
alert( Boolean(0) ); // false
alert( Boolean("hello") ); // true
alert( Boolean("") ); // false
let age = null;//age 为空或者未知
let x;
alert(x); // 弹出 "undefined"
let fruits = ["Apple", "Orange", "Plum"];
数组是对象,无法用typeof
检测出来
console.log(typeof fruits) //object
用isArray
alert(Array.isArray({})); // false
alert(Array.isArray([])); // true
let fruits = ["Apple", "Orange", "Pear"];
console.log(fruits.shift()); // Apple
console.log(fruits);//["Orange", "Pear"]
fruits.unshift("myApple");
console.log(fruits) //["myApple", "Orange", "Pear"]
console.log(fruits.pop()) //Pear
fruits.push("myPear");
console.log(fruits) // ["myApple", "Orange", "myPear"]
console.log(typeof fruits) //object
数组是对象,但是用delete
删除,数组长度没变小。
应该删除元素,得到更短的数组。
splice
可以做所有事情:**添加,删除和插入元素。**并且允许负向索引
从第几个索引开始删除第几个元素,有什么替代。
let fruits = ["Apple", "Orange", "Pear","banan"];
let remove = fruits.splice(1,2,"a","b");
console.log(remove);//["Orange", "Pear"]
console.log(fruits)//["Apple", "a", "b", "banan"]
// 删除0各元素,就可以是插入而不删除
fruits.splice(0,0,"a")
console.log(fruits);// ["a", "Apple", "a", "b", "banan"]
得到子数组,与String用法相同
let str = "test";
let arr = ["t", "e", "s", "t"];
console.log(str.slice(1, 3)); // es
console.log(arr.slice(1, 3)); //["e", "s"]
console.log(str.slice(-2)); // st
console.log(arr.slice(-2)); // ["s", "t"]
for (let i = 0; i < arr.length; i++)
for (let fruit of fruits) {
alert( fruit );
}
for ... in
不推荐用于数组,但可以用于类数组,有索引。 for (const key in fruits) {
console.log(`${key}=>${fruits[key]}`)
// 0 => Apple
// 1 => Orange
// 2 => Pear
// 3 => banan
}
Symbol.isConcatSpreadable
属性。
如果具有,那就所有的元素都会被复制,否则,只复制本身。
let arr = [1, 2];
console.log(arr.concat([3,4],5,6,"a"));//[1, 2, 3, 4, 5, 6, "a"]
let arrayLike = {
0:"something",
length: 1
};
console.log(arr.concat(arrayLike));
// (3) [1, 2, {…}]
// 0: 1
// 1: 2
// 2: {0: "something", length: 1}
// length: 3 `在这里插入代码片`
let arrayLike = {
0:"something",
[Symbol.isConcatSpreadable]: true,
length: 1
};
console.log(arr.concat(arrayLike));//[1, 2, "something"]
arr.indexOf(item, from)
从索引 from
查询 item
,如果找到返回索引,否则返回 -1。arr.lastIndexOf(item, from)
— 和上面相同,只是从尾部开始查询。arr.includes(item, from)
— 从索引 from
查询 item
,如果找到则返回 true。includes
的一个非常小的差别是它能正确处理NaN
,而不像 indexOf/lastIndexOf.
find
:适用于对象数组,如果为true
返回item
,否则返回undefined
let users = [{
id: 1,
name: "John"
},
{
id: 2,
name: "Pete"
},
{
id: 3,
name: "Mary"
}
];
let user = users.find(item => item.id == 1);
console.log(user.name);//John 适用于对象数组
findeIndex
:find
本质相同,但返回的是索引。let userIndex = users.findIndex(item => item.id == 1);
console.log(userIndex)//0
filter
:返回的是一个类数组,如果需要匹配的很多,可以用filter
let filterUser = users.filter(item => item.id == 1); //适用于需要匹配的结果有很多。
console.log(filterUser)//返回类数组
// [
// {
// id:1,
// name: "John"
// },
// length: 1
// ]
它对数组中每个元素调用函数并返回符合结果的数组。
有一个返回值
let element =users.map(item => item.name)
console.log(element)//["John", "Pete", "Mary"]
let arr = [ 1, 2, 15 ];
// 该方法重新排列 arr 的内容(并返回它)
arr.sort();
alert( arr ); // 1, 15, 2
啊哈!!怎么会是这样呢,因为默认按照字符串排序哒
怎么办呢? arr.sort((a, b) => a - b);
let arr = [1,4,3,5,2,'a','c'];
arr.sort((a, b) => a - b);
console.log(arr);//[1, 2, 3, 4, 5, "a", "c"]
颠倒顺序
let arr = [1, 2, 3, 4, 5];
arr.reverse();
alert( arr ); // 5,4,3,2,1
let names = 'Bilbo, Gandalf, Nazgul';
let arr = names.split(', ');
for (let name of arr) {
console.log(`A message to ${name}.`);
// A message to Bilbo.
// A message to Gandalf.
// A message to Nazgul.
}
let arr = ['Bilbo', 'Gandalf', 'Nazgul'];
let str = arr.join(';');
alert( str ); // Bilbo;Gandalf;Nazgul
let value = arr.reduce(function(previousValue, item, index, arr) {
// ...
}, initial);
let arr = [1, 2, 3, 4, 5];
let result = arr.reduce((sum, current) => sum + current, 0);
let result1 = arr.reduce((sum, current) => sum + current,);
alert(result); // 15
alert(result1); // 15
reduce
将数组的第一个元素作为初始值,并从第二个元素开始迭代。let arr = [];
// Error: Reduce of empty array with no initial value
// 如果初始值存在,reduce 将返回空 arr。
arr.reduce((sum, current) => sum + current);
reduceRight
同reduce
,只是从右向左遍历。["Bilbo", "Gandalf", "Nazgul"].forEach((item, index, array) => {
alert(`${item} is at index ${index} in ${array}`);
});
typeof undefined // "undefined"
typeof 0 // "number"
typeof true // "boolean"
typeof "foo" // "string"
typeof Symbol("id") // "symbol"
typeof NaN // number
typeof Math // "object" (1)
typeof null // "object" (2) null 不是一个 object。
//null 有自己的类型,它是一个特殊值。再次强调,这是 JavaScript 语言的一个错误。
typeof alert // "function" (3)
JavaScript 中有七种基本的数据类型(译注:前六种为基本数据类型,也属于原生类型,而 object 为复杂数据类型)。
number 用于任何类型的数字:整数或浮点数。
string 用于字符串:一个字符串可以包含一个或多个字符,所以没有单独的单字符类型。
boolean 用于 true 和 false。
null 用于未知的值 —— 只有一个 null 值的独立类型。
undefined 用于未定义的值 —— 只有一个 undefined 值的独立类型。
symbol 用于唯一的标识符。
object 用于更复杂的数据结构。
我们可以通过 typeof 运算符查看存储在变量中的数据类型。
学习对象类型