Es6新特性总结
在阅读Es6文档的时候学到了很多新知识,写博客记录一下其中一部分
文章目录
- 一、变量声明 let const var
- 二、新的基本数据类型
- symbol
- 三、function
- 字符串新方法
- 对象object新方法
- 1. Object.is()
- 2. Object.assign()
- 3. Object.keys()、Object.values()、Object.entries()
- 数组新方法
- 1. Array.from()
- 2. includes()
- eval()
- 四、属性描述符
- 什么时候会出现属性不可配置
- 五、class(类)
- 核心概念
- 重要特性
- 总结
一、变量声明 let const var
- let和const具有块级作用域,var不存在块级作用域。
- 变量提升:var存在变量提升,let和const不存在。
- 重复声明:var可以重复声明,其他俩个不存在
- 暂时性死区:用let和const声明变量的时候,该变量都 不可用,称为暂时性死区。使用var声明的变量没有暂时性死区。
- 初始值设置:只有const在声明变量的时候需要设置初始值
二、新的基本数据类型
symbol
symbol通过symbol创造,他的特性就是通过symbol()创造出来的都是独一无二的,即使描述相同值也不同。主要用途是作为对象的属性名,避免属性名冲突
// 创建一个 Symbol
const sym1 = Symbol();
const sym2 = Symbol('description'); // 可选的描述文本,仅用于调试console.log(typeof sym1); // "symbol"
console.log(sym1 === sym2); // false
console.log(sym2.description); // "description"(获取描述)
三、function
字符串新方法
- includes()可以判断字符串中是否有目标字符串,返回true和false
- startWith()和endWith()可以判断字符串是否以目标字符串为开头或结尾,目标字符串就是函数参数,而增加的第二个参数可以指定开始查找的位置。
- repeat()函数用于将原字符串重复指定的次数,并返回一个新的字符串。俩个参数一个是重复的字符串,一个是重复的次数。
- padStart()和padEnd()用指定字符串按照给定长度从后面或者前面补全字符串
代码如下(示例):
let arr = 'hell';
console.log(arr.padEnd(5,'o')); //'hello'
console.log(arr.padEnd(6,'o')); //'helloo'
console.log(arr.padEnd(6)); //'hell ',如果没有指定将用空格代替console.log(arr.padStart(5,'o')); //'ohell'
对象object新方法
1. Object.is()
是用来判断俩个值是否为同一值,返回布尔值,它与严格相等运算符(===)类似,但在处理一些特殊值时行为有所不同。在比较NaN和NaN时Object.is()返回true,而严格相等运算符返回false。比较+0和-0的时候Object.is()返回false另一个返回true。
// 基本类型比较
console.log(Object.is('foo', 'foo')); // true
console.log(Object.is('foo', 'bar')); // false// 数字比较
console.log(Object.is(1, 1)); // true
console.log(Object.is(1, '1')); // false
console.log(Object.is(NaN, NaN)); // true (与 === 不同)
console.log(Object.is(+0, -0)); // false (与 === 不同)// 对象比较(比较引用)
const obj1 = { a: 1 };
const obj2 = { a: 1 };
const obj3 = obj1;console.log(Object.is(obj1, obj2)); // false(不同引用)
console.log(Object.is(obj1, obj3)); // true(相同引用)
2. Object.assign()
该方法可以浅拷贝对象,一般用于合并对象,它可以将一个或多个源对象的可枚举属性复制到目标对象,并返回合并后的目标对象。
const target = { a: 1, b: 2 };
const source1 = { b: 3, c: 4 };
const source2 = { d: 5 };Object.assign(target, source1, source2);
console.log(target); // { a: 1, b: 3, c: 4, d: 5 }
3. Object.keys()、Object.values()、Object.entries()
- Object.keys()可以返回对象中所有的属性名
- Object.values()返回对象里面的所有属性值
- Object.entries()将每一对属性和属性值按照数组的形式返回
数组新方法
1. Array.from()
是 JavaScript 中用于从类数组对象(array-like)或可迭代对象(iterable)创建新数组实例的方法。
Array.from(arrayLike[, mapFn[, thisArg]])
- arrayLike:必需,类数组对象或可迭代对象(如字符串、Set、Map、NodeList 等)
- mapFn:可选,映射函数,对每个元素进行处理后再放入新数组
- thisArg:可选,执行 mapFn 时的 this 指向
// arguments 对象(函数中的类数组)
function func() {return Array.from(arguments);
}
console.log(func(1, 2, 3)); // [1, 2, 3]// 带 length 的对象
const arrayLike = { length: 3, 0: 'a', 1: 'b', 2: 'c' };
console.log(Array.from(arrayLike)); // ['a', 'b', 'c']
他也可以用在拷贝数组上,拷贝的方式是浅拷贝
const original = [1, 2, 3];
const copy = Array.from(original);
console.log(copy); // [1, 2, 3]
console.log(copy === original); // false
2. includes()
判断数组中是否存在该元素,返回布尔值,与字符串那个方法使用方法相似
eval()
eval() 函数会将传入的字符串当做 JavaScript 代码进行执行。如果其参数不是字符串,则会将参数原封不动地返回。
function构造函数允许用字符串创造函数,在创造函数里面加上“use strict”可以开启严格模式。严格模式的好处:消除静默错误,转为抛出错误。防止意外的全局变量,要求函数参数名唯一,在非严格模式下,相同参数名,后一个会覆盖前一个,而在严格模式下,这个是不允许的。严格 模式禁止八进制字面量,而且禁止把eval和arguments作为变量名。在函数里面打印this得到undefined。而且禁止对制度变量赋值。
四、属性描述符
js中的每个对象属性都有一些隐藏的特性,叫属性描述符。
const obj = { name: 'John' };// 获取属性描述符
const descriptor = Object.getOwnPropertyDescriptor(obj, 'name');
console.log(descriptor);
// 输出: { value: 'John', writable: true, enumerable: true, configurable: true }
当 configurable: false 时,以下操作会被禁止:
- 不能删除属性
- 不能修改属性描述符,除了 writable的修改,如果尝试修改会报错
- 不能修改属性类型
这就叫属性不可配置
什么时候会出现属性不可配置
- 使用Object.defineProperty()明确设置,将configurable的值设置为false。
const obj = {};
Object.defineProperty(obj, 'readOnly', {value: 'cannot change',writable: false,enumerable: true,configurable: false // 明确设置为不可配置
});
- 内置对象和方法的属性
// Math.PI 是不可配置的
const descriptor = Object.getOwnPropertyDescriptor(Math, 'PI');
console.log(descriptor.configurable); // false// 数组的length属性通常不可配置
const arr = [1, 2, 3];
const lengthDescriptor = Object.getOwnPropertyDescriptor(arr, 'length');
console.log(lengthDescriptor.configurable); // false
- 使用Object.freeze()、Object.seal()、Object.preventExtensions()
Object.freeze(obj)
静态方法可以使一个对象被冻结。冻结对象可以防止扩展,并使现有的属性不可写入和不可配置。被冻结的对象不能再被更改:不能添加新的属性,不能移除现有的属性,不能更改它们的可枚举性、可配置性、可写性或值,对象的原型也不能被重新指定。freeze() 返回与传入的对象相同的对象。参数obj是想要冻结的对象。但这是浅冻结,如果对象的属性本身他们也是对象则这些对象不会被冻结。
Object.seal()
静态方法密封一个对象。密封一个对象会阻止其扩展并且使得现有属性不可配置。密封对象有一组固定的属性:不能添加新属性、不能删除现有属性或更改其可枚举性和可配置性、不能重新分配其原型。只要现有属性的值是可写的,它们仍然可以更改。seal() 返回传入的同一对象。他与Object.freeze(obj)的区别就是后者不允许修改属性值,但Object.seal() 可以修改属性值,只要他们是可写的。其他的和上面哪个差不多。
Object.preventExtensions()
静态方法可以防止新属性被添加到对象中(即防止该对象被扩展)。它还可以防止对象的原型被重新指定。这个方法导致目标对象的[[Prototype]]属性不可变,即原型不能被重新设置,但其他属性依旧保持可变。
五、class(类)
在Es6中,class是一个新的语法糖,用于创建对象和实现面向对象编程(OOP)。它提供了更简洁、更接近传统面向对象语言的语法,但其本质仍然是基于原型的继承系统。简化了原型继承的写法,使代码个更加简洁和可读。
基本语法如下
class ClassName {// 构造函数constructor(parameters) {// 初始化实例属性}// 实例方法methodName() {// 方法体}// 静态方法static staticMethod() {// 静态方法体}// getter 和 setterget property() {// 返回属性值}set property(value) {// 设置属性值}
}
核心概念
- 类的定义与实例化
class Person {// 构造函数,创建实例时自动调用constructor(name, age) {this.name = name; // 实例属性this.age = age;}// 实例方法sayHello() {console.log(`Hello, I'm ${this.name}`);}// 静态方法(属于类本身,而非实例)static createAdult(name) {return new Person(name, 18);}
}// 实例化类
const person1 = new Person("Alice", 25);
person1.sayHello(); // 输出: "Hello, I'm Alice"// 使用静态方法
const adult = Person.createAdult("Bob");
adult.sayHello(); // 输出: "Hello, I'm Bob"
- 继承(extends 和 super)
class Student extends Person {constructor(name, age, major) {// 调用父类构造函数super(name, age);this.major = major; // 子类特有属性}// 重写父类方法sayHello() {super.sayHello(); // 调用父类方法console.log(`I'm studying ${this.major}`);}// 子类特有方法study() {console.log(`${this.name} is studying`);}
}const student = new Student("Charlie", 20, "Computer Science");
student.sayHello();
// 输出:
// "Hello, I'm Charlie"
// "I'm studying Computer Science"
student.study(); // 输出: "Charlie is studying"
- Getter 和 Setter
用于封装属性访问:
class Rectangle {constructor(width, height) {this._width = width;this._height = height;}// Getterget area() {return this._width * this._height;}// Setterset width(value) {if (value > 0) {this._width = value;} else {throw new Error("Width must be positive");}}
}const rect = new Rectangle(10, 20);
console.log(rect.area); // 输出: 200(调用 getter)rect.width = 15; // 调用 setter
console.log(rect.area); // 输出: 300
重要特性
1.不存在提升 :类声明不会像函数那样被提升,必须先定义再使用。
2. 严格模式 :类体内部自动运行在严格模式下(“use strict”)。
3. 方法不可枚举 :类定义的方法默认是不可枚举的,与 Object.defineProperty 定义的方法行为一致。
4. 必须使用 new 调用 :直接调用类(如 Person())会抛出错误。
5. 私有属性(ES2022 引入):使用 # 前缀定义私有属性,只能在类内部访问:
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。