浅谈ES6新特性的知识点

网络基础(二):数制转换与分类编址的IPv4地址 本文介绍数制转换、IP地址、分类编址的IPv4地址,希望对你有帮助! 阅读详情

ES6新特性列表
相比ES5,ES6提供了太多的更新,简单说来,主要为以下方面(大家可以依据自己不算清晰的点选择性查看本文):

Arrows,箭头函数

Classes,类

Enhanced object literals,增强的对象字面值

Template strings:模板字符串

Destructuring:解构

Default + rest + spread:参数默认值,rest参数,扩展运算符

Let + const:命名声明的新方式

Iterators + for…of:遍历器

Generators:生成器

Unicode:更广泛的编码支持

Modules:语言层面上支持的模块机制

Module loaders:模块加载器

Map + set + weakmap + weakset:新的数据结构

Proxies:代理器

Symbols:新的基本类型,独一无二的值

Subclassable built-ins:类的继承

Promises:

Math + number + string + array + object apis:拓展了一些内置对象的方法

Binary and octal literals:二进制八进制字面量

Reflect api:操作对象的新api

Tail calls:尾调用

Arrows箭头函数
箭头函数使用类似于 =>这样的语法定义函数,支持表达式模式和语句模式,不过其最大特点在于和父作用域具有一样的 this。我们知道普通函数的 this 既不指向函数自身也不指向函数的词法作用域,this 实际上是在函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用。使用箭头函数时再也不用担心 this跳来跳去了。 此外如果箭头函数如果定义在另一个函数里面,箭头函数会共享它父函数的arguments变量。

// 表达式模式箭头函数
var odds = evens.map(v => v + 1);
var nums = evens.map((v, i) => v + i);
var pairs = evens.map(v => ({even: v, odd: v + 1}));
// 语句模式箭头函数
nums.forEach(v => {
  if (v % 5 === 0)
    fives.push(v);
});
// 和父作用域具有相同的this
var bob = {
  _name: "Bob",
  _friends: [],
  printFriends() {
    this._friends.forEach(f =>
      console.log(this._name + " knows " + f));
  }
}
function square() {
  let example = () => {
    let numbers = [];
    for (let number of arguments) {
      numbers.push(number * number);
    }
    return numbers;
  };
  return example();
}
square(2, 4, 7.5, 8, 11.5, 21); // returns: [4, 16, 56.25, 64, 132.25, 441]

Classes
JavaScript中其实并不存在真正的类,ES6的类其实是基于原型链模拟面向对象的一种语法糖。其本质上可以看做是构造函数的另一种写法。 与真的类一样,它支持 super继承,实例,静态方法和 constructor方法。 如果你也使用React,工作中定义模块时一定没少写过 class A extends React.Component{}吧。

// 定义类

class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }
  toString() {
    return '(' + this.x + ', ' + this.y + ')';
  }
}
// 通过extends关键字实现继承
class SkinnedMesh extends THREE.Mesh {
  //constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。
  //一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。
  constructor(geometry, materials) {
    // super表示父类的构造函数,用来新建父类的this对象,
    // 子类必须在constructor方法中调用super方法,否则新建实例时会报错。如果不调用super方法,子类就得不到this对象。
    super(geometry, materials);
    //在构造方法中绑定this,可以防止实例找不到this
    this.idMatrix = SkinnedMesh.defaultMatrix();
    this.bones = [];
    this.boneMatrices = [];
    //...
  }
  // 非定义在this上的方法都会被直接定义在原型链上
  update(camera) {
    //...
    // super在此处作为对象,在普通方法中,指向父类的原型对象;在静态方法中,指向父类。
    super.update();
  }
  // 可以使用get和set关键字,对某个属性设置存值函数和取值函数
  get boneCount() {
  // 类的方法内部如果含有this,它默认指向类的实例
    return this.bones.length;
  }
  set matrixType(matrixType) {
    this.idMatrix = SkinnedMesh[matrixType]();
  }
  // 加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用
  static defaultMatrix() {
    return new THREE.Matrix4();
  }
}
// 类的所有实例共享一个原型对象
let skin = new SkinnedMesh();
// 静态方法需要直接通过类调用
SkinnedMesh.defaultMatrix()

对象的拓展
ES6中对象的使用方法得以拓展,主要包括以下几点:

属性和方法可以简洁表示;

允许以表达式的模式定义属性名;

可以通过 __proto__读取或设置当前对象的prototype对象;

使用 Object.is({},{})判断两个对象是否完全相对,类似于 ===;

Object.assign(target, source1, source2)合并对象;(浅拷贝)


Object.assign(target, source1, source2)合并对象;(浅拷贝)
var obj = {
    // __proto__用以设置当前对象的prototype对象,不推荐使用,推荐使用Object.setPrototypeOf() 
    __proto__: theProtoObj,
    //‘handler:handler’可简写为handler(只需要写变量名就可以实现变量名为变量名,变量值为属性值)
    handler,
    // 简写在定义方法的时候同样有效
    toString() {
     // Super calls
     return "d " + super.toString();
    },
    // 方括号内的表达式用以计算属性名
    [ 'prop_' + (() => 42)() ]: 42
};

模板字符串
模板字符串是一种组合字符串的语法糖,其使用类似于 Perl, Python等语言的字符串修改方法类似,它的出现让我们拼合字符串时方便多了。目前相互中几乎所有字符串的拼接都用这个了,异常方便。

模板字符串定义在两个反撇号中;

在模板字符串中可以直接换行,格式会得以保留;

通过 ${}可以很方便的在模板字符串中添加变量;

// 把字符串放在``(注意不是引号)中就可以使用
`

In JavaScript '\n' is a line-feed.`
// 模板字符串保留了换行
`In JavaScript this is
 not legal.`
// 在字符串中添加变量的方法,变量直接放在${}中即可
var name = "Bob", time = "today";
`Hello ${name}, how are you ${time}?`
// 拼合请求时异常方便了
POST`http://foo.org/bar?a=${a}&b=${b}
     Content-Type: application/json
     X-Credentials: ${credentials}
     { "foo": ${foo},
       "bar": ${bar}}`(myOnReadyStateChangeHandler);

Destructuring 解构
解构使用模式匹配的方法绑定变量和值,数组和对象都可使用。解构在绑定失败的时会实现软绑定,即没有匹配值时,返回 undefined。使用方法可见示例

// 数组解构
var [a, , b] = [1,2,3];
// a = 1,b = 3
// React中常见以下用法
var {a, b, c} = this.props;
// 对象解构也能用在函数的参数中
function g({name: x}) {
  console.log(x);
}
g({name: 5})
// 绑定失败时返回undefined
var [a] = [];
a === undefined;
// 解构时也可以绑定默认值
var [a = 1] = [];
a === 1;
// 配合默认参数使用结构
function r({x, y, w = 10, h = 10}) {
  return x + y + w + h;
}
r({x:1, y:2}) === 23

默认值,剩余值和拓展值
ES6允许我们在给变量添加默认值

使用拓展值使得函数调用时可传入数组作为连续的参数

利用剩余值特性我们可以把函数尾部的参数转换为一个数组,现在使用 rest就可以替换以前的 arguments对象了。

// 给函数的参数添加默认值
function f(x, y=12) {
  // y is 12 if not passed (or passed as undefined)
  return x + y;
}
// 可以只传参数x的值了
f(3) == 15
// 使用rest
function f(x, ...y) {
  // y is an Array
  return x * y.length;
}
f(3, "hello", true) == 6
// 传入数组作为参数
function f(x, y, z) {
  return x + y + z;
}
// 直接传入数组当作上面函数的参数
f(...[1,2,3]) == 6

Let 和 Const
ES6新增了块作用域,新增了两种定义变量的方法,定义变量时推荐使用 let替代 var, let定义的变量在块作用域内有效, const用以指定固定值,这两类新定义的变量不允许在定义前使用,也不允许重复定义。

function f() {
  {
    let x;
    {
      const x = "sneaky";
      // 改变const
      x = "foo";
    }
    // 重复定义会出错
    let x = "inner";
  }
}
// 在这里想到一个使用var时新手特别容易犯的问题
for (var i=0; i<10; ++i) {
    setTimeout(function(){
        console.log(i);
    }, i*1000);
}
// 使用var 所有的结果都是10
// 使用let 结果就是预想要的结果
for (let i=0; i<10; ++i) {
    setTimeout(function(){
        console.log(i);
    }, i*1000);
}

Iterators + For…Of
ES6为部署了Iterator接口的各种不同的数据结构提供了统一的访问机制。其本质是一个指针对象。每次调用 next方法,可以把指针指向数据结构的下一个成员。具体说来,每一次调用next方法,都会返回数据结构的当前成员的信息(一个包含value和done两个属性的对象,value属性是当前成员的值,done属性是一个布尔值,表示遍历是否结束)。

凡是部署了Symbol.iterator属性的数据结构,就称为部署了遍历器接口。调用这个接口,就会返回一个遍历器对象。

let fibonacci = {
// 一个数据结构只要具有Symbol.iterator属性,就可被认为是可遍历的,Symbol.iterator是一个表达式,返回Symbol对象的iterator属性,所以需要放在[]中,本质上它是当前数据结构的遍历器生成函数。
[

Symbol.iterator]() {
    let pre = 0, cur = 1;
    return {
      next() {
        [pre, cur] = [cur, pre + cur];
        return { done: false, value: cur }
      }
    }
  }
}
// fibonacci部署了Symbol.iterator属性,只要done不为true就会一直遍历
for (var n of fibonacci) {
// 调用1000以内的值做遍历
  if (n > 1000)
    break;
  console.log(n);
}

原生具备 Iterator接口的数据结构有以下几种:数组、某些类似数组的对象(字符串、DOM NodeList 对象、arguments对象)、Set和Map结构。

对象(Object)之所以没有默认部署Iterator接口,是因为对象的哪个属性先遍历,哪个属性后遍历是不确定的,需要开发者手动在Symbol.iterator的属性上部署遍历器生成方法(原型链上的对象具有该方法也可)。

实际使用时需引入polyfill

Generators
可以从两个角度理解 Generators,它既是状态机也是一个遍历器对象生成函数。执行该函数可以理解为启动了遍历器,之后每次执行 next()函数则每次执行到 yield处。

值得注意的是执行 next()时可添加参数,这实现了在函数运行的不同阶段,可以从外部向内部注入不同的值,

生成器使用 function和 yield简化了迭代过程,使用 function定义的函数返回了一个生成器实例。 生成器是迭代器的子类,但是包含 next和 throw。这使得值可以回流到生成器, yield是一个可以返回值的表达式。

for…of循环可以自动遍历 Generator 函数时生成的 Iterator对象,此时不再需要调用 next方法。

Generator的 return方法会返回固定的值,终结遍历Generator函数。返回值的value属性就是return方法的参数,返回值的done属性为true。

结合 co模块可以实现比Promise更加优雅的异步调用方式

// 使用generator函数实现上述遍历器对象

var fibonacci = {
  [Symbol.iterator]: function*() {
    var pre = 0, cur = 1;
    for (;;) {
      var temp = pre;
      pre = cur;
      cur += temp;
      yield cur;
    }
  }
}
for (var n of fibonacci) {
  // truncate the sequence at 1000
  if (n > 1000)
    break;
  console.log(n);
}
// 使用co模块(基于 Promise 对象的自动执行器),可以实现异步函数的自动执行
var gen = function* () {
  var f1 = yield somethingAsync();
  var f2 = yield anotherThingAsync();
};
var co = require('co');
co(gen);

实际使用时需引入polyfill

Unicode
ES6完整支持所有的Unicode,包括新的 Unicode字面量和 u模式正则,提供了新的API来处理 21bit级别的字符串。这些新加特性使得我们的JavaScript应用有能力支持各种语言。

// same as ES5.1
"𠮷".length == 2
// 新的正则匹配模式
"𠮷".match(/./u)[0].length == 2
// 新形式
"\u{20BB7}"=="𠮷"=="\uD842\uDFB7"
// codePointAt()能够正确处理4个字节储存的字符,返回一个字符的码点
"𠮷".codePointAt(0) == 0x20BB7
// for-of 遍历字符,以整体输出
for(var c of "𠮷") {
  console.log(c);
}

// 𠮷

我们也可以在JS中写出Emoji了,很有趣,对不对:

Modules
现代JS应用的开发离不开模块了,ES6对模块的定义提供了语言层面的支持。规范化了各种JavaScript模块加载器,支持运行时动态加载模块,支持异步加载模块。

ES6 模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量,效率要比 CommonJS 模块的加载方式高。

// lib/math.js 模块的定义

export function sum(x, y) {
  return x + y;
}
export var pi = 3.141593;
// app.js 模块的全部引用
import * as math from "lib/math";
alert("2π = " + math.sum(math.pi, math.pi));
// otherApp.js 模块的部分引用
import {sum, pi} from "lib/math";
alert("2π = " + sum(pi, pi));
// 模块导出方法
// lib/mathplusplus.js
export * from "lib/math";
export var e = 2.71828182846;
export default function(x) {
    return Math.log(x);
}
// 混合引入方法
import ln, {pi, e} from "lib/mathplusplus";
alert("2π = " + ln(e)*pi*2);

Module Loaders(其实并非ES6标准的一部分,只是草案)
模块加载器支持以下功能:

动态加载

状态隔离

全局命名空间隔离

编写钩子

嵌套

默认的模块加载器可以被配置,新的加载器可以被配置来评估加载独立上下文中的内容。

// 动态加载 – ‘System’ 是默认的加载器

System.import('lib/math').then(function(m) {
  alert("2π = " + m.sum(m.pi, m.pi));
});
// 新的加载器创建了执行沙盒
var loader = new Loader({
  global: fixup(window) // replace ‘console.log’
});
loader.eval("console.log('hello world!');");
// 可以直接修改模块的缓存
System.get('jquery');
System.set('jquery', Module({$: $})); // WARNING: not yet finalized

Map Set WeakMap WeakSet
ES6为算法提供了新的高效的数据结构, WeakMaps提供了防泄漏的键值对表。


// Set类似于数组,但是成员的值都是唯一的,没有重复的值。
var s = new Set();
s.add("hello").add("goodbye").add("hello");
s.size === 2;
s.has("hello") === true;
// Map 类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
var m = new Map();
m.set("hello", 42);
m.set(s, 34);
m.get(s) == 34;
// WeakMap结构与Map结构类似,也是用于生成键值对的集合,但是WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名,此外WeakMap的键名所指向的对象,不计入垃圾回收机制。
var wm = new WeakMap();
wm.set(s, { extra: 42 });
wm.size === undefined
// WeakSet 结构与 Set 类似,也是不重复的值的集合,但是WeakSet 的成员只能是对象,而不能是其他类型的值,此外WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用
var ws = new WeakSet();
ws.add({ data: 42 });
// Because the added object has no other references, it will not be held in the set

实际使用时需引入polyfill

Proxies
Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程。

可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。

需要注意的是目前未被Babel支持,使用时需谨慎


// target参数表示所要拦截的目标对象;
var target = {};
// handler参数也是一个对象,用来定制拦截行为;
var handler = {
  get: function (receiver, name) {
    return `Hello, ${name}!`;
  }
};
// 生成一个Proxy实例
var p = new Proxy(target, handler);
p.world === 'Hello, world!';
// 对函数同样可以使用代理
var target = function () { return 'I am the target'; };
var handler = {
  apply: function (receiver, ...args) {
    return 'I am the proxy';
  }
};
var p = new Proxy(target, handler);
p() === 'I am the proxy';

// Proxy支持的拦截操作如下

var handler =
{
  get:...,
  set:...,
  has:...,
  deleteProperty:...,
  apply:...,
  construct:...,
  getOwnPropertyDescriptor:...,
  defineProperty:...,
  getPrototypeOf:...,
  setPrototypeOf:...,
  enumerate:...,
  ownKeys:...,
  preventExtensions:...,
  isExtensible:...
}
Babel 不支持,使用时应注意

Symbols
Symbol保证每个属性的名字都是独一无二的,这样就从根本上防止了属性名的冲突; 它是一种类似于字符串的数据类型,Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述; Symbols是唯一的,单并非私有的,通过 Object.getOwnPropertySymbols可以获取对应的值; Symbol 值作为对象属性名时,不能用点运算符。

var MyClass = (function() {
  // module scoped symbol
  var key = Symbol("key");
  function MyClass(privateData) {
    this[key] = privateData;
  }
  MyClass.prototype = {
    doStuff: function() {
      ... this[key] ...
    }
  };
  return MyClass;
})();
var c = new MyClass("hello")
c["key"] === undefined

由于语言限制,Babel只提供部分支持,使用时需要注意

内置类的继承
在ES6中,内置的 Array, Date, DOM Element可以被继承以拓展了。

// User code of Array subclass
class MyArray extends Array {
    constructor(...args) { super(...args); }
}
var arr = new MyArray();
arr[1] = 12;
arr.length == 2
babel 部分支持,由于ES5引擎的限制 Date, Array, Error不被支持,但是 HTMLElement是被支持的

Math + Number + String + Array + Object APIs
ES6 为很多旧有对象添加了新的API,这些对象包括 Math, Array器, String, Object,如下:

Number.EPSILON
Number.isInteger(Infinity) // false
Number.isNaN("NaN") // false
Math.acosh(3) // 1.762747174039086
Math.hypot(3, 4) // 5
Math.imul(Math.pow(2, 32) - 1, Math.pow(2, 32) - 2) // 2
"abcde".includes("cd") // true
"abc".repeat(3) // "abcabcabc"
Array.from(document.querySelectorAll('*')) // Returns a real Array
Array.of(1, 2, 3) // Similar to new Array(...), but without special one-arg behavior
[0, 0, 0].fill(7, 1) // [0,7,7]
[1, 2, 3].find(x => x == 3) // 3
[1, 2, 3].findIndex(x => x == 2) // 1
[1, 2, 3, 4, 5].copyWithin(3, 0) // [1, 2, 3, 1, 2]
["a", "b", "c"].entries() // iterator [0, "a"], [1,"b"], [2,"c"]
["a", "b", "c"].keys() // iterator 0, 1, 2
["a", "b", "c"].values() // iterator "a", "b", "c"
Object.assign(Point, { origin: new Point(0,0) })
babel 通过 polyfill 提供部分支持

二进制和八进制字面量
ES6添加了二进制和八进制数值的字面量定义方法:

0b111110111 === 503 // true
0o767 === 503 // true
babel 只支持字面量形式,不支持 Number("0o767")形式

Promise
Promise为异步编程提供了一种新的方式,Promise把未来将用到的值当做一等对象,Promise在很多前端库中已经有所支持了。这个平时用得最多了,还没使用的推荐试试。

function timeout(duration = 0) {
    return new Promise((resolve, reject) => {
        setTimeout(resolve, duration);
    })
}
var p = timeout(1000).then(() => {
    return timeout(2000);
}).then(() => {
    throw new Error("hmm");
}).catch(err => {
    return Promise.all([timeout(100), timeout(200)]);
})

实际使用时需引入polyfill

Reflect API
Reflect对象与Proxy对象一样,也是 ES6 为了操作对象而提供的新 API,作用如下:

将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上;

修改某些Object方法的返回结果,让其变得更合理;

让Object操作都变成函数行为,比如name in obj和delete obj[name],而Reflect.has(obj, name)和Reflect.deleteProperty(obj, name)让它们变成了函数行为。

Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法;

var O = {a: 1};
Object.defineProperty(O, 'b', {value: 2});
O[Symbol('c')] = 3;
Reflect.ownKeys(O); // ['a', 'b', Symbol(c)]
function C(a, b){
  this.c = a + b;
}
var instance = Reflect.construct(C, [20, 22]);
instance.c; // 42
实际使用时需引入polyfill

Tail Calls
尾部调用被保证不能无限拓展栈,这让有无限制输入时的递归算法更加安全。

function factorial(n, acc = 1) {
    'use strict';
    if (n <= 1) return acc;
    return factorial(n - 1, n * acc);
}
// 堆栈越来越常用,在ES6中其使用更加安全了
factorial(100000)

说明
上文对ES6的新特性都做了简单的描述,但是关于 Reflect API和 Proxies,由于本人对他们的理解还不够透彻,说得可能有些不清不楚。希望阅读本文让你有收获,有任何疑问,大家也可以一起讨论。

如何用YOLOv5改进无人机小目标检测?MFFSODNet实战教程(附代码) 本文详细介绍了如何利用YOLOv5框架结合MFFSODNet网络结构优化无人机航拍图像中的小目标检测。通过引入微小目标预测头、多尺度特征提取模块(MSFEM)和双向密集特征金字塔网络(BDFPN)等核心技术,显著提升了小目标检测精度。文章提供了完整的代码实现方案,并展示了在农业监测、电力巡检等实际场景中的应用效果。 阅读详情

相关推荐

从DWS到设备树:MTK平台LK阶段GPIO初始化的隐秘路径与调试实战

本文深入探讨了MTK平台LK阶段GPIO初始化的完整流程,揭示了从DWS配置到设备树生成的隐秘转换路径。通过分析MT6768等平台的启动框架,提供了针对preloader到LK阶段GPIO初始化异常的实战调试方法与最佳实践,帮助开发者有效解决硬件与软件配置不匹配的常见问题。

h9j8k7l6m5n的博客 1003

ES6 新特性有哪些

1. 拥有块级作用域,这意味着在 if 语句、for 循环、while 循环等代码块中声明的 let 变量,只在该代码块内有效。2. 不允许在同一作用域内重复声明同一个变量1. 也具有块级作用域。2. 声明时必须进行初始化赋值,且赋值后不能再重新赋值修改其值。3. 如果 const 声明的是一个对象或数组,虽然不能重新赋值整个对象或数组,但可以修改对象的属性值或数组的元素值。

weixin_64684095的博客 8706

JavaScript进阶(二十六):ES各版本特性详解

ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,European Computer Manufacturers Association)通过ECMA-262标准化的脚本程序设计语言。这种语言在万维网上应用广泛,它往往被称为JavaScript或JScript,所以它可以理解为是JavaScript的一个标准,但实际上后两者是ECMA-262标准的实现和扩展。

IT全栈 华强工作室 4886

PCL点云DBSCAN聚类算法:基于密度的点云聚类

核心点是在给定半径内拥有足够多邻居点的点,边界点是在给定半径内没有足够多邻居点但是位于核心点的邻域内的点,噪声点是既不是核心点也不是边界点的点。本文将介绍PCL中的DBSCAN(基于密度的空间聚类应用噪声)算法,用于点云数据的聚类。上述示例代码首先从PCD文件中读取点云数据,并设置了DBSCAN聚类的参数,包括邻域搜索半径(epsilon)和邻域内最小点数(min_points)。需要注意的是,示例代码中的点云数据格式为pcl::PointXYZ,如果使用其他类型的点云数据,需要相应地修改代码。

LpmShell的博客 1238

C语言试题三之计算并输出 s=1+(1+2^(0.5))+(1+2^(0.5)+3^(0.5))+…+(1+2^(0.5)+3^(0.5)+…+n^(0.5))

1 、题目 计算并输出 s=1+(1+2^(0.5))+(1+2^(0.5)+3^(0.5))+…+(1+2^(0.5)+3^(0.5)+…+n^(0.5)) 2、部分函数说明 C 库函数 double pow(double x, double y) 返回 x 的 y 次幂。 3、源代码实现 #include <stdio.h> #include <...

码莎拉蒂 4609

ES6 Truncate String -- 可以用于文章摘要限制显示字数

Truncate String  字符串删节(截取) 截断字符串到指定的长度 const truncateString = (str, num) => str.length > num ? str.slice(0, num > 3 ? num - 3 : num) + '...' : str; 举个例子: var str = "Apache Ant is a Java bas

arsaycode 640

2026AI漫剧放心大胆做!小白也能轻松出片(附保姆级教程)

要是在2025,我大概率会劝他再等等,毕竟那时工具还没这么顺手。但到了2026年的今天,我的回答得很干脆:放心去做,绝对没问题。这一年多来,AI漫剧这块的变化真可谓翻天覆地。过去你想拍个像样的短片,哪怕再简陋,也得凑齐拍摄设备、找场地、找演员,后期剪辑更是折磨。但现在,时代变了,AI已经把创作的门槛踏平了。你不需要请演员,也不用操心灯光布景,更不用为剪辑特效烧钱。一个人,一台电脑,花几天时间就能做一部完整的AI漫剧。你只要有有想表达的故事,突发的灵感,剩下的,都能直接交给AI落地。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 470

js es6 新特性

es6都有哪些新特性

程序员良仔 1515

(11-3-01 )

以太坊(Ethereum)是一种基于区块链技术的开源平台和加密货币。它于2015年由Vitalik Buterin和Gavin Wood等开发者创建,并成为比特币之后最受欢迎的加密货币之一。以太坊不仅支持加密货币交易,还为开发者和企业提供了构建去中心化应用程序的强大工具。在本节的内容中,将实型一个完整的机器学习模型项目,智能检测出以太坊区块链中的非法账户。从问题定义到模型建立和评估,再到最终的总结和建议。本实例突出了处理类别不平衡问题的重要性,并展示了如何使用多种机器学习算法来解决实际问题。此外,通过数据可

码农三叔 2170

Android 11.0 app添加校验锁(输入密码才能进入app)

11.0定制化开发中客户要求给app添加锁,就是点击app 图标时,会弹出Dialog,需要输入密码才能进入app中,就是应用校验锁, 最开始想到在Launcher3中实现,但是如果更换了默认Launcher 又不行了 所以最终还是得拦截app启动Activity 从这里入手了 Launcher与APP是在两个不同的进程中,他们之间的通信是通过Binder完成的,点击Launcher上的某个APP,这时会调用Launcher的startActivitySafely方法。 public boolean sta

安卓兼职framework和app工程师的博客 1952

最全的—— ES6有哪些新特性?

目录ES6新特性一、let和const二、symbol三、解构表达式3.1 数组解构5.对象方面6.函数方面proxy5.字符串迭代器class6.promise async7.模块化模块化优点 ES6新特性 一、let和const 前面讲过:https://blog.youkuaiyun.com/ZLJ_999/article/details/123960186 二、symbol Symbol是ES6中引入的一种新的基本数据类型,用于表示一个独一无二的值,不能与其他数据类型进行运算。它是JavaScript中的第

admin_zlj的博客 7万+

无人飞行器和车辆的协同配送物资问题——附带MATLAB代码

通过建立城市地图、生成物资点和配送任务、路径规划、协同调度以及仿真和评估等步骤,可以有效地解决物资配送的优化问题。通过建立城市地图、生成物资点和配送任务、路径规划、协同调度以及仿真和评估等步骤,可以有效地解决物资配送的优化问题。我们的目标是最小化物资配送的总时间,同时确保每个物资点都被正确配送的无人飞行器或车辆所访问。我们的目标是最小化物资配送的总时间,同时确保每个物资点都被正确配送的无人飞行器或车辆所访问。我们首先需要建立一个城市地图,包括物资点、无人飞行器的起始点和车辆的起始点。

CyberJolt的博客 950

浅谈ES6新特性

一、let及const 1、ES6新增的两种新的声明格式        let 和const 用于补全ES5标准中var声明变量的不足:在JavaScript中用’var’来声明变量会出现变量提升的情况,即通过"var"声明的变量系统都会把声明隐式的升至顶部,这样的特性往往会让刚接触JavaScript及习惯其他语言的开发人员不适应,导致程序出现问题。 2、ES5中定义作用域有两种     &nbs

Darlingmi的博客 288

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

浅谈 JavaScript、ECMAScript (ES5、ES6)是什么、相互关系

一、ECMAScript 和 JavaScript 的关系 ES6 === ECMAScript6 从百度百科的资料上来看: ECMAScript是一种由Ecma国际通过ECMA-262标准化的脚本程序设计语言。这种语言在万维网上应用广泛,它往往被称为JavaScript 或 JScript,但实际上后两者是 ECMA-262 标准的实现和扩展。 ECMAScript 和 JavaScri...

愿我如星君如月 ... 夜夜流光相皎洁 ... 3413

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JavaScript 中的 require / exports、import / export、浅谈JavaScript、ES5、ES6

Node.js 的基础教学 之 exports 和 module.exports:https://zhuanlan.zhihu.com/p/82057593 浅谈 JavaScript、ES5、ES6:https://www.cnblogs.com/lovesong/p/4908871.html 1、为什么有模块概念 理想情况下,开发者只需要实现核...

墨鱼菜鸡 5024

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

浅谈JavaScript、ES5、ES6

什么是JavaScript JavaScript一种动态类型、弱类型、基于原型的客户端脚本语言,用来给HTML网页增加动态功能。(好吧,概念什么最讨厌了) 动态: 在运行时确定数据类型。变量使用之前不需要类型声明,通常变量的类型是被赋值的那个值的类型。 弱类: 计算时可以不同类型之间对使用者透明地隐式转换,即使类型不正确,也能通过隐式转换来得到正确的类型。 原型: 新对象继承对象(作为模版),将自身的属性共享给新对象,模版对象称为原型。这样新对象实例化后不但可以享有自己创建时和运行时定义的属性

zhangge3663的博客 1013

浅谈ES6变量解构,即解构赋值

解构赋值语法是一种 JS表达式。ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。通过解构赋值, 可以将属性/值从对象/数组中取出,赋值给其他变量。        在ES6解构赋值出现之前,我们需要为变量赋值的时候,只能直接指定值。      &n...

huangfuyk.的博客 3835

浅谈ES标准的演变

CMAScript从1997年第一版诞生依赖,经过无数人的“踩坑”和“填坑”,到现在,ES12呼之欲出。那么我们不妨讨论一下ES的发展历程,看它如何统一江湖,看它“曲折”而又令人期待的发展之路。

【蜀山风行】的专栏 1301

浅谈ES6

ES6是咱前端必备的技能,不过,你真的理解ES6 的核心新特性吗? 今天来浅谈一下ES5与ES6的箭头函数与对象结构之间的区别有多大吧! 比如使用箭头函数: // ES5箭头函数写法let f = function(v){ return v } // ES6箭头函数写法 let f = v => v ES6 中箭头函数的语法非常简单:标识符=>表达式。代码量可以减少 50%以上。 再比如对象解构:​​​​​​​ //ES5var obj1 = { a..

qq_39182492的博客 146

浅谈ES6的新特性(结合代码对比ES5语法)

ES6中的let关键字提供了块级作用域,解决了var关键字导致的变量提升和重复声明问题。这使得代码的作用域更加清晰,减少了潜在的错误。

Zzexi的博客 529

前端面试系列一:JavaScript / ES6

快来加入我们吧! "小和山的菜鸟们",为前端开发者提供技术相关资讯以及系列基础文章。为更好的用户体验,请您移至我们官网小和山的菜鸟们 ( https://xhs-rookies.com/ ) 进行学习,及时获取最新文章。 "Code tailor" ,如果您对我们文章感兴趣、或是想提一些建议,微信关注 “小和山的菜鸟们” 公众号,与我们取的联系,您也可以在微信上观看我们的文章。每一个建议或是赞同都是对我们极大的鼓励! 面试系列不定期更新,请随时关注 前言 本篇专栏重点在于讲解面试中 JavaScript

XHSRookies的博客 220

浅谈ES6类

ECMAScript6中终于引入了类的特性,在此之前只能通过其他方法定义并关联多个相似的对象,当然了,ES6中的类与其他语言中的还是不太一样,其语法的设计实际上借鉴了JavaScript的动态性,本文档简单介绍一下ES6及其新特性。 类的声明 ES6中声明一个类,首先编写class关键字,紧跟着是类的名字,其他部分的语法类似于对象字面量方法的简写形式,但是不需要子类的各元素之间使用逗号分...

bangyan5368的博客 107

浅谈es6

学习es6, 强烈推荐阮一峰老师的文章: http://es6.ruanyifeng.com/?search=Iterator&x=3&y=11

仗剑东游的猫 202
上一篇: 详解 CSS 居中布局技巧
下一篇: 详解小程序授权登录获取openid时遇到invalid code的问题
星海设计
博客等级 码龄19年 13粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星海设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值