基本数据类型包装类型
基本数据类型:字符串类型 数据类型 布尔类型 空类型 未定义类型
通过字面量创建的基本数据类型的数据都是常量
常量特点:常量是不能被修改的,每次修改或拼接都是生成一个新的
但是可以用字符串方法replace修改
let str =" abc";
let newStr =str.replace("b","m");
基本类型特点:没有属性和方法
对象类型的特点:有属性和方法
以前之所以能够访问基本数据类型的属性和方法, 是因为
在运行的时候系统自动将基本数据类型包装成了对象类型
let str = "www.baidu.com"
// let str =new String(str)
常见的基本包装类型 String() / Number() /J Boolean()
三大对象
在JavaScript中提供三种自带的对象,分别是"本地对象" "内置对象" "宿主对象"
宿主:就是指JavaScript运行环境,js可以在浏览器中运行,也可以在服务器上运行(nodejs)
本地对象:与宿主无关,无论在浏览器还是服务器中都有的对象,就是ECMAScript标准中定义的类(构造函数),在使用过程中需要我们手动new创建.例如:Boolean、Number、String、Array、Function、Object、Date、RegExp等。
内置对象:与宿主无关,无论在浏览器还是服务器中都有的对象,ECMAScript已经帮我们创建好的对象. 在使用过程中无需我们手动new创建.例如:Global、Math、JSON
宿主对象:对于嵌入到网页中的JS来说,起宿主对象就是浏览器,所以宿主对象就是浏览器提供的对象,包含:Window和Document等.所有的DOM和BOM对象都属于宿主对象
自定义对象:我们自己编写的类创建的对象
Math内置对象
Math.floor() 向下取整 // 直接砍掉所有的小数位就是向下取整
let num = 3.9;
let value = Math.floor(num);
console.log(value); //3
Math.ceil() 向上取整 // 只要有小数位就会给整数位+1, 然后砍掉所有小数位
let num = 3.9;
let value = Math.ceil(num);
console.log(value); //4
Math.round() 四舍五入 // 和小学数学一样, 如果小数位满5就会进1
let num = 3.5;
let value = Math.round(num);
console.log(value);//4
Math.abs() 绝对值 // 和小学数学一样, 统一变为正数
let num = -3;
let value = Math.abs(num);
console.log(value); // 3
Math.random() 生成随机数 // 会生成一个0~1的随机数, 但是不包括1
let value = Math.random();
console.log(value);
需求: 要求生成一个1~10的随机数
function getRandomIntInclusive(min,max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min; //含最大值 最小值
}
let value = getRandomIntInclusive(1,10);// MDN文档
console.log(value);
JSON
JSON 格式(JavaScript Object Notation 的缩写)是一种用于数据交换的文本格式,2001年由 Douglas Crockford 提出,目的是取代繁琐笨重的 XML 格式。
JSON 对值的类型和格式有严格的规定。
- 复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象。
- 简单类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和null(不能使用NaN, Infinity, -Infinity和undefined)。
- 字符串必须使用双引号表示,不能使用单引号。
- 对象的键名必须放在双引号里面。
- 数组或对象最后一个成员的后面,不能加逗号。
以下是合格的 JSON 值。
["one", "two", "three"]
{ "one": 1, "two": 2, "three": 3 }
{"names": ["张三", "李四"] }
[ { "name": "张三"}, {"name": "李四"} ]
以下是不合格的 JSON 值。
{ name: "张三", 'age': 32 } // 属性名必须使用双引号
[32, 64, 128, 0xFFF] // 不能使用十六进制值
{ "name": "张三", "age": undefined } // 不能使用undefined
{ "name": "张三",
"birthday": new Date('Fri, 26 Aug 2011 07:13:10 GMT'),
"getName": function() {
return this.name;
}
} // 不能使用函数和日期对象
需要注意的是,空数组和空对象都是合格的 JSON 值,null本身也是一个合格的 JSON 值。
ES5 新增了JSON对象,用来处理 JSON 格式数据。它有两个方法:JSON.stringify()和JSON.parse()
基本用法
JSON.stringify方法用于将一个值转为字符串。该字符串符合 JSON 格式,并且可以被JSON.parse方法还原。
JSON.stringify('abc') // ""abc""
JSON.stringify(1) // "1"
JSON.stringify(false) // "false"
JSON.stringify([]) // "[]"
JSON.stringify({}) // "{}"
JSON.stringify([1, "false", false])
// '[1,"false",false]'
JSON.stringify({ name: "张三" })
// '{"name":"张三"}'
上面代码将各种类型的值,转成 JSON 字符串。
需要注意的是,对于原始类型的字符串,转换结果会带双引号。
JSON.stringify('foo') === "foo" // false
JSON.stringify('foo') === "\"foo\"" // true
上面代码中,字符串foo,被转成了""foo""。这是因为将来还原的时候,双引号可以让 JavaScript 引擎知道,foo是一个字符串,而不是一个变量名。
如果原始对象中,有一个成员的值是undefined、函数或 XML 对象,这个成员会被过滤。
var obj = {
a: undefined,
b: function () {}
};
JSON.stringify(obj) // "{}"
上面代码中,对象obj的a属性是undefined,而b属性是一个函数,结果都被JSON.stringify过滤。
如果数组的成员是undefined、函数或 XML 对象,则这些值被转成null。
var arr = [undefined, function () {}];
JSON.stringify(arr) // "[null,null]"
上面代码中,数组arr的成员是undefined和函数,它们都被转成了null。
正则对象会被转成空对象。
JSON.stringify(/foo/) // "{}"
JSON.stringify方法会忽略对象的不可遍历属性。
JSON.parse()
JSON.parse方法用于将JSON字符串转化成对象。
JSON.parse('{}') // {}
JSON.parse('true') // true
JSON.parse('"foo"') // "foo"
JSON.parse('[1, 5, "false"]') // [1, 5, "false"]
JSON.parse('null') // null
var o = JSON.parse('{"name": "张三"}');
o.name // 张三
如果传入的字符串不是有效的JSON格式,JSON.parse方法将报错。
JSON.parse("'String'") // illegal single quotes
// SyntaxError: Unexpected token ILLEGAL
上面代码中,双引号字符串中是一个单引号字符串,因为单引号字符串不符合JSON格式,所以报错。
深拷贝的另一种写法
var obj = {
name: 'hunger',
age: 3,
friends: ['aa', 'bb', 'cc']
}
var obj2 = JSON.parse(JSON.stringify(obj))
obj.age = 4
console.log(obj2.age)