day15JS-es6的基础语法

 1. 严格模式

1.1 严格模式的使用方法

使用方法1:"use strict"; 开启严格模式。

使用方法2:<script type="moaule"></script> 当设置script标签为模块化时,自动启用严格模式。

 1.2 严格模式的限制

1. 要求变量不能重名

//报错
"use strict";
var a=2;
var a=4;

 2. 函数中的参数不能同名

//报错
"use strict";
function fn(a, a) {

};
fn(1, 2);

 3. 在不声明变量的情况下使用变量,是不允许的

"use strict";
x = 3.14;  // 会引发错误(x 未定义)

 4. 对象也是变量,在不声明对象的情况下使用对象也是不允许的

"use strict";
x = { p1: 10, p2: 20 };      // 这将引发错误

 

 5. 删除变量(或对象)是不允许的

"use strict";
var x = 3.14;
delete x; // 这将引发错误

 6. 删除函数是不允许的

"use strict";
function x(p1, p2) { };
delete x;// 这将引发错误

7. 不能使用with

 with的注意事项!!!

  • with在设置某个对象下的属性时,必须保证这个属性是存在的不能新建,就可以修改
  • 如果不存在,意味着with定义了一个全局的变量

 with的使用案例:

        // 不能使用with
        var div = document.querySelector("div");
        div.style.width = "50px";
        div.style.height = "50px";
        with (div.style) {
            width = "50px";
            height = "50px"
            backgroundColor = "red"
        }

 案例:

        var o = {
            a: 1,
            b: {
                c: 3,
                d: 4
            }
        }

        with (o.b) {
            c = 5;
            d = 10;
            e = 20;
        }
        console.log(o);
        console.log(e);

 

8.  建议大家使用eval (反射),eval 的作用是将字符串反射为js语句

console.log("3+4");//"3+4"
console.log(eval("3+4"));//7

 

9. 八进制数值文本不允许的

"use strict";
var x = 010; // 这将引发错误

10.  使用转义字符不允许的

"use strict";
var x = \010;// 这将引发错误

11.写入只读属性不允许的

"use strict";
var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});

obj.x = 3.14;// 这将引发错误

12.写入只能获取的属性不允许的

"use strict";
var obj = {get x() {return 0} };

obj.x = 3.14;// 这将引发错误

13. 删除不可删除的属性不允许的

"use strict";
delete Object.prototype; // 这将引发错误

14. 字符串 "eval" 和 "arguments" 不可用作变量

"use strict";
var eval = 3.14;// 这将引发错误
"use strict";
var arguments = 3.14;// 这将引发错误

 1.3 在严格模式下this的指向

 查看day10JS-this的使用情况。

1.4 执行函数的方式有哪些?

  1. 函数名();  ---> 例如:fn();
  2. new 函数名(); ---> 例如:new fn();
  3. 函数名.call(); ---> 例如: fn.call()
  4. 函数名.apply(); ---> 例如: fn.apply();

1.5 call()方法 /apply()方法

1. call(); 方法 /apply(); 方法 传入方法第一个参数Object对象时this 指向的就是那个传入的Object对象。因为这两个方法在执行函数会将函数中 this 指向为call() /apply()方法中的第一个参数。这两个方法的作用就是改变this的指向开不开启严格模式都不会影响this的指向

function fn() {
     console.log(this);
}
let object = { a: 1 };
fn.call(object);
fn.apply(object);

 注意特殊情况!!!

非严格模式下

2. 传入call()方法第一个参数undefined或者是nullthis指向的是window

3. 传入call()方法第一个参数基本数据类型,会将传入的内容转换为第一个参数的对应的对象类型this指向的是该基本数据类型的对象

严格模式下

this将指向参数传入的内容

 非严格模式下:

// 非严格模式 : window
function fn(a, b) {
     console.log(this, a, b); 
}
fn.call(undefined, 1, 2)//window 1 2
fn.call(null, 1, 2)//window 1 2

//非严格模式下:会将传入的内容转换为对应的对象类型
fn.call(1)//Number undefined undefined
fn.call("a")//String undefined undefined
fn.call(true)//Boolean undefined undefined

严格模式下:

//严格模式 : this将指向参数传入的内容
"use strict";
function fn(a, b) {
     console.log(this, a, b); 
}
fn.call(undefined, 1, 2)//undefined 1 2
fn.call(null, 1, 2)//null 1 2

fn.call(1)//1 undefined undefined
fn.call("a")//a undefined undefined
fn.call(true)//true undefined undefined

1.6 call()方法 /apply()方法的区别

call()方法 :call传参一个个传。例如: fn.call(object,1,2);

apply()方法 :apply传参传入数组。例如:fn.apply(object,[1,2]);

1.7 callee属性与caller属性

1. 在严格模式下不允许使用calleecaller。非严格模式下可以使用。

callee是arguments的一个属性,指向其函数自身

2. caller返回一个函数的引用这个函数里面调用了当前使用caller属性的函数

使用这个属性要注意:

  1. 这个属性只有当函数在执行时才有用。
  2. 如果在javascript程序中,函数是由顶层调用的,则返回null

非严格模式的案例: 

//非严格模式
function fn() {
      console.log(arguments.callee);//就是当前函数
}
fn();

非严格模式的案例:  callee的作用就是可以删除当前函数

document.addEventListener("click", function () {
    document.removeEventListener("click", arguments.callee)
})

非严格模式的案例: : caller

        function fn1() {
            console.log(fn1.caller);//在全局中执行fn1,上下文环境的函数就是null
            fn2();
        }
        function fn2() {
            console.log(fn2.caller);//执行当前函数上下文环境中函数fn1
        }
        fn1();

2. 解构赋值

2.1 数组的补充知识

1. 数组的最后一个元素空元素,那么它不作为数组的元素length的长度不加上空元素的长度。

2. 空元素不等于undefined

补充知识1的案例:

//补充知识1的案例:
var arr = [1, 2,];
console.log(arr);
console.log(arr.length);//2

补充知识2的案例: 

var arr = [1, 2, , 3, undefined, 4];
console.log(arr.length);//6

注意!!!

1. forEach遍历数组不会遍历数组中的空元素,但会遍历数组中的undefined

3. for循环遍历数组会遍历数组中的空元素,遍历结果空元素是undefined也会遍历数组中的undefined

      var arr=[1,2,,3,,4];
      arr.forEach(function(item){
          console.log(item);//1 2 3 4
      })
--------------------------------------
      var arr=[1,2,,3,,4];
      for(var i=0;i<arr.length;i++){
        console.log(arr[i]);//1 2 undefined 3 undefined 4
      }
-----------------------------------------
      var arr=[1,2,,3,undefined,4];
      arr.forEach(function(item){
          console.log(item);//1 2 3 undefined 4
      })
------------------------------------------
      var arr=[1,2,,3,undefined,4];
      for(var i=0;i<arr.length;i++){
        console.log(arr[i]);//1 2 undefined 3 undefined 4
      }

如何使用for循环去除数组中的空元素。使用in来判断这个属性是否是这个对象的属性。

      var arr=[1,2,,3,undefined,4];
      for(var i=0;i<arr.length;i++){
          if(i in arr){
              console.log(arr[i]);//1 2 3 undefined 4
          }
      }

2.2 解构赋值的用途与使用方法

解构赋值主要用于数组解构对象解构数组解构按位解构, 对象解构按属性名解构

数组解构的使用方法:var/let [变量名1,变量名2, ...] = [值1,值2, ...];

对象解构的使用方法:var/let {变量名1,变量名2, ...} = {值1,值2, ...};

 2.3 数组解构的案例

普通数组解构:

数组解构按位解构
let [a,b]=[1,2];//a=1,b=2
-------------------------
交换案例:
let a=1;
let b=2;
[b,a]=[a,b];
console.log(a,b);//a=1,b=1
-------------------------
let [a,b]=[1,2,3];
console.log(a,b);//a=1,b=2
-------------------------
let [a,b]=[1];
console.log(a,b);//a=1,b=undefined
-------------------------
// 给b设置初始值,如果b没有得到解构值,则是0
let [a,b=0]=[1];
console.log(a,b);//a=1,b=0

函数数组解构:

      function fn([a,b=0]){
        console.log(a,b);//a=1,b=0
      }
      fn([1]);
 -------------------------------------
      //这种赋值方式是由上面而得到的
      function fn(a,b=0){

      }
      fn(1);
---------------------------------------
      //这个解构赋值是 fn1=fn11这个函数,fn2=fn22这个函数,
      let [fn1,fn2]=[
          function(){//取个别名fn11
              console.log("fn11");
          },
          function(){//取个别名fn22
              console.log("fn22");
          }
      ]
      fn1();//fn11
      fn2();//fn22

2.4 对象解构案例

对象解构按属性名解构,该属性名不存在那就是undefined

普通对象解构:

      // 对象解构
      // 对象解构按属性名解构,该属性名不存在那就是undefined
      let {a,c}={a:1,b:2};
      console.log(a,c);//a=1,c=undefined
---------------------------------------------
      //b有没有值?b没有值,因为b被重新二次分配给了{c,d},b不存在。
      //b不存在就是未定义,会报错。但是a、c、d是存在的
      let {a,b:{c,d}}={a:1,b:{c:3,d:4}};
      console.log(a,b);//报错

      //如果就想要b怎么办,那就不解构b
      let {a,b}={a:1,b:{c:3,d:4}}
      console.log(a,b);//a=1,b={c:3,d:4}

      //如果a,b,c,d都想要怎么办,b一次不解构,一次解构
      let {a,b:{c,d},b}={a:1,b:{c:3,d:4}};
      console.log(a,b,c,d);//a=1,b={c:3,d:4},c=3,d=4
---------------------------------------------
      // 可以设置默认值
      let {a,b=0}={a:1}
      console.log(a,b);//a=1,b=0

函数对象解构:在使用解构赋值作为函数参数传参,可以忽略函数参数先后顺序。

      // 在使用解构赋值作为函数参数传参,可以忽略函数参数先后顺序
      function fn({a,b,c=2}){
          console.log(a,b,c);//a=1,b=2,c=2
      }
      fn({a:1,b:2});

注意!!!

函数的参数问题

函数传参的顺序必须严格按照这个顺序来写:必填参数,默认值参数,可选参数,剩余参数。

例如:function fn(a , b=2 , c , ...arg){ };

 对象解构作为函数参数使用,可以避免参数传递的先后顺序问题。

对象解构中有相同属性名需要起别名,别名给入这个变量新的名字。

      function fn({num,bool,fn}) {
          //这种不牵扯到必填的问题
          console.log(num,bool,fn);//num=1,bool=undefineed,fn=一个函数
      }

      fn({num:1,fn:function(){

      }});
-------------------------------------------
       //如果已经有了a这个属性名,我就给它取一个别名。
        let {a,b:{a:a1}}={a:1,b:{a:2}};
        console.log(a,a1);//a=1,a1=2
--------------------------------------------
        // 如果已经有了a这个属性名,我就给它取一个别名并且赋初始值
        //如果没有匹配到就使用初始值。
        let {a,b:{a:a1=0}}={a:1,b:{}};
        console.log(a,a1);//a=1,a1=0
----------------------------------------------
       //如果后面没有b,那么b是有初始值为{a:3}
        let {a,b:{a:a1=0}={a:3}}={a:1};
        console.log(a,a1);//a=1,a1=3
-----------------------------------------------
        //如果后面有b,所以不取初始值{a:3}
        //但是b是一个空对象,b里面没有a1,所以a1取初始值0
        let {a,b:{a:a1=0}={a:3}}={a:1,b:{}};
        console.log(a,a1);//a=1,a1=0
-------------------------------------------------
        let {a,b:{a:a1=0}={a:3}}={a:1,b:{a:10}};
        console.log(a,a1);//a=1,a1=10
------------------------------------------------------
    function fn({ a, b: { a: a1 = 0 } = { a: 3 } } = { a: 1, b: {} }) {
      console.log(a, a1);
    }
    //没有传参,使用默认值
    fn();//a=1,a1=0

    // {a,b:{a:a1=0}={a:3}}是形参,{ a: 1 }是实参
    // {a,b:{a:a1=0}={a:3}}={a:1}
    // 后面没有b,所以取初始值{a:3}
    fn({ a: 1 });//a=1,a1=3

    // {a,b:{a:a1=0}={a:3}}={a:1,b:{a:10}}
    fn({ a: 1, b: { a: 10 } });//a=1,a1=10

3. Set集合与Map映射

3.1 Array与Object

        Array:是紧密结构,使用下标存储数据,存储的数据可以重复,无序存储(不会自动排序)可以手动排序,不关心key只关心存储的值。查询速度慢、添加删除速度慢 。

        Object : 是松散结构,以键值对形式(key->value)存储,存储key不能重复,value值是可以重复,无序存储并且不能排序,查找速度快,可以直接根据key找到对应value值,添加删除速度快。无法获取对象的数据长度。key要求必须是字符串或者symbol,如惠不是就会自动隐式转换为字符串 。

3.2 Set集合与Map映射

        Set集合:松散结构,没有key,只有value的集合,数据不能重复(唯一),不能排序插入删除速度快,可以得到集合中数据的长度,可以遍历,查找速度快 。

        Map映射:松散结构,键值对形式存储,查找和添加删除速度快,不能排序,可以获取到数据存储的长度,key可以是任何类型 松散结构,键值对形式存储,查找和添加删除速度快,不能排序,可以获取到数据存储的长度,Key可以是任何类型。

3.3  WeakSet集合与WeakMap映射

 WeakSet:弱引用集合。

 WeakMap:弱引用映射。

3.4 迭代器

  1. HTMLCollection
  2. NodeList
  3. arguments
  4. Array
  5. Set本身也是迭代器

4. Set集合的方法

let s = new Set([1,2,3,4])
console.log(s);

  1. add() : 添加。如果添加相同的value值不会重复添加的
  2. delete() : 删除。
  3. has() :判断这个值在集合中是否存在,返回值是布尔值。
  4. clear() : 清除集合中所有的数据。
  5. size属性:Set集合没有length,但可以使用.size属性查看Set集合中数据的多少。
        let s=new Set([1,2,3,4]);
        // set的增加方法不重复value值,使用添加
        s.add(5);
        s.add(5);
        console.log(s);//Set(5) {1, 2, 3, 4, 5}

        s.delete(5)//删除
        console.log(s);//Set(4) {1, 2, 3, 4}

       //判断这个值在集合中是否存在,得到布尔值
        console.log(s.has(5));//false

        //清除所有数据
        s.clear();
        console.log(s.clear());//undefined
        console.log(s);//Set(0) {}

        //数据的多少,没有length,只能通过size获取
        console.log(s.size);//0

Set集合的遍历方法:

1.  forEach

2. for of

        let s=new Set([1,2,3,4]);
        //方法一:
        s.forEach(function(value){
            console.log(value);//1 2 3 4 
        })
         //方法二:
        for(var value of s){
            console.log(value);//1 2 3 4 
        }

5. Set集合的使用场景

5.1 去重

var arr=[1,2,3,1,2,3,4,5,7,6,4,3,2,4,6,5,7];
//把数组arr放到Set集合中,Set集合去重,在使用数组的from()方法把Set集合转成数组
var arr1=Array.from(new Set(arr));
console.log(arr);//[1, 2, 3, 1, 2, 3, 4, 5, 7, 6, 4, 3, 2, 4, 6, 5, 7]
console.log(arr1);//[1, 2, 3, 4, 5, 7, 6]
console.log(arr1===arr);//false

使用Set去重有缺点就是引用地址会改变,去重过后的数组与原来的数组不是同一个。所以去重看实际开发的要求来使用。

 5.2 减少查找

 

6.  WeakSet集合

undefined与null的区别:undefined只是开辟了空间没有赋值。null的作用就是清除引用关系,方便垃圾回收机制回收。

7. Map映射

 8. WeakMap映射

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: cesium-popup-es6是一个基于ES6语法编写的Cesium.js的弹窗组件,用于在Cesium地图上显示自定义的弹窗内容。 这个组件主要包含了以下几个部分: 1. Popup类:这是弹窗的主要类,负责创建和管理弹窗的各种属性和方法。通过使用Popup类,可以很方便地在地图上创建弹窗,并设置弹窗的位置、大小、内容等。 2. 事件监听:cesium-popup-es6还提供了一些事件监听的方法,可以在弹窗的打开、关闭以及其他交互操作时进行相应的处理。例如,可以监听鼠标点击事件来关闭弹窗,或者监听地图的移动事件来更新弹窗的位置。 3. 样式定制:该组件允许用户通过设置自定义的CSS样式来定制弹窗的外观和风格。这使得用户可以根据自己的需要来修改弹窗的颜色、字体、边框等样式属性,从而实现个性化的弹窗显示效果。 4. 兼容性:cesium-popup-es6能够很好地与Cesium.js的其他功能和插件进行集成,同时对不同的浏览器和设备也具备良好的兼容性。这意味着无论是在PC端还是移动端,无论是在Chrome还是在Safari等浏览器上,cesium-popup-es6都能够正常运行。 总的来说,cesium-popup-es6文档提供了关于如何使用和定制这个弹窗组件的详细说明,方便开发者在Cesium.js地图项目中加入自定义的弹窗功能。无论是展示地理信息、交互操作还是其他相关需求,cesium-popup-es6都能够帮助开发者实现一个易于使用和美观的弹窗效果。 ### 回答2: cesium-popup-es6 是一个基于 Cesium.js 的弹出窗口组件,该组件使用 ES6 编写。它为用户提供了在 Cesium 场景中高度可定制的弹出窗口功能。 组件的文档详细介绍了 cesium-popup-es6 的使用方法和各个配置项的说明。首先,你需要通过 npm 或者其他构建工具下载并引入该组件。然后,在你的代码中创建一个 Popup 实例并传入相应的参数,包括弹出窗口的内容、位置、大小、样式等。 文档中还介绍了组件的主要功能,包括弹出窗口显示和隐藏的方法,以及与 Cesium 场景的交互。你可以通过调用 show 方法来显示弹出窗口,通过调用 hide 方法来隐藏弹出窗口。组件还提供了许多配置项,例如你可以自定义弹出窗口的样式、位置以及与其它元素的交互等。 文档中也提供了丰富的示例代码,以帮助用户更好地理解和使用 cesium-popup-es6 组件。这些示例代码覆盖了各种场景,包括在固定位置显示弹出窗口、在鼠标点击位置显示弹出窗口等。 总的来说,cesium-popup-es6 文档提供了详细的使用说明和示例代码,帮助用户了解和使用该弹出窗口组件。用户可以根据自己的需求进行定制,实现丰富多样的弹出窗口效果。 ### 回答3: cesium-popup-es6 是一个基于ES6语法的Cesium.js库的文档。 该文档主要用于指导开发者在使用cesium-popup-es6库时的操作步骤和相关功能的使用方法。 文档的目录结构清晰明了,按照功能模块进行分类,方便开发者快速找到需要的信息。 在文档的开头部分,首先介绍了cesium-popup-es6的基本概述,包括其功能特点和适用场景,帮助开发者了解该库的作用和优势。 接下来,文档详细介绍了cesium-popup-es6的安装和配置步骤。通过简明的指导,开发者可以快速将该库引入到自己的项目中,并进行相应的配置。 然后,文档详细说明了cesium-popup-es6库的各种功能和使用方法。比如,如何创建和定位弹出窗口、如何设置窗口内容和样式、如何捕获窗口的事件等等。每一项功能都给出了具体的代码示例和详细的说明,方便开发者理解和应用。 文档还提供了一些常见问题的解答和一些建议的最佳实践,帮助开发者在使用cesium-popup-es6库时避免一些常见的问题和错误。 最后,文档附带了一些附录,包括cesium-popup-es6的API参考和一些相关的资源链接,方便开发者查阅进一步的信息和深入理解该库。 总之,cesium-popup-es6 文档是一份详尽而全面的文档,对于开发者学习和使用cesium-popup-es6库非常有帮助,可以提高开发效率并简化开发过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值