ES6新语法之---对象字面量扩展、模板字符串(5)

这节课学习ES6中对象字面量扩展和新增模板字符串

第一部分:对象字面量扩展

1.简洁写法

  ES6对于对象字面量属性提供了简写方式。

  1.1:属性简写

        //传统写法
        var x = 2, y = 3,
            o = {
                x: x,
                y: y
            };

        //ES6简洁写法
        var x = 2, y = 3,
            o = {
                x,  //属性名和赋值变量名相同时,可简写
                y
            };

  1.2:方法简写

        //传统写法
        var o = {
            x: function() {
                //...
            },
            y: function() {
                //...
            }
        }

        //ES6简洁写法
        var o = {
            x() {
                //...
            },
            y() {
                //...
            }
        }

  1.3简洁方法的局限

  分析下面代码是否可以通过简洁方法重构:

        function runSomething(o) {
            var x = Math.random(),
                y = Math.random();
            return o.something(x, y);   //通过o调用属性方法
        }

        runSomething({
            something: function something(x, y) {
                if (x > y) {
                    return something(y, x)  // 当不符合条件时,递归调用something()方法
                }
                return y - x;
            }
        });

  这里的‘something:‘属性和function something()各有用途,属性something可以通过o对象调用,而function something()在自身内部调用用于递归实现

  分析1:在obj对象内部通过obj.something()实现递归

        function runSomething(o) {
            var x = Math.random(),
                y = Math.random();
            return o.something(x, y);   //通过o调用属性方法
        }
        var obj = {
            something: function(x, y) {
                if (x > y) {
                    return obj.something(y, x)  // 这里我们使用obj调用functiong
                }
                return y - x;
            }
        };
        runSomething(obj);

  如果obj对象的引用指向不发生改变的话,那么这是一个很好的办法。但obj的指向我们并不能控制

  分析2:使用this调用obj中的something()方法

        var obj = {
            something: function(x, y) {
                if (x > y) {
                    return this.something(y, x)  // 这里使用this调用
                }
                return y - x;
            }
        };

  这里的this和分析1中的问题一样,我们无法保证something()方法始终是obj调用的这样就会存在this的绑定陷阱,可能this表示的并不是obj本身。

  例如:btn.addEventListener("click", obj.something, false);此时的this就不再是obj对象本身了,可能有人说可以使用obj.something.bind(obj)再绑定回去,这么麻烦就没必要了。

  再回头看我们最初1.3中的问题:

        runSomething({
            something: function something(x, y) {
                if (x > y) {
                    return something(y, x)
                }
                return y -x;
            }
        })

  这里面function something()中的something总是指向这个something()这个函数本身,为我们提供了一个用于递归/事件绑定/解绑的引用,不会和this纠缠也不需要不可靠的对象引用。

  使用ES6的语法简化:

        runSomething({
            something(x, y) {
                if (x > y) {
                    return something(y, x)      // Uncaught ReferenceError: something is not defined
                }
                return y -x;
            }
        })

  可以看到代码报错,因为其中something(x, y)会被解释为:something:function(x, y){...},这样return中的something方法就是未定义的。

总结:简洁方法很方便,但是应该只在不需要他们执行递归/事件绑定/解绑时候使用。否则我们还是应该使用 something: function something(){...}这种传统的方式。

  1.4计算属性名

  计算属性名:对象中一个或多个属性名是通过某个表达式计算得来的。

        var prefix = "user_";
        var o = {
            baz: function () {
                //...
            }
        };
        o[prefix + ‘foo‘] = function () {   //[]中可以放任意合法表达式
            // ...
        }
        o[prefix + ‘bar‘] = function () {
            // ...
        }

  计算属性名也可以作为简洁方法的名称出现:

        var o = {
            ["f" + "oo"]() {    // 作为简洁方法的名称出现
                //...
            }
        }

第二部分:模板字符串

  1.ES6引入了一个新的字符串字面量,使用`作为界定符,这样的字符串字面值支持嵌入基本的字符串插入表达式,会被自动解析和求值。

  1.1传统拼接字符串方式:

        var name = "Kyle";
        var greeting = "Hello " + name + "!";   //使用传统的‘+‘拼接字符串
        console.log(greeting);
        console.log(typeof greeting);

  1.2ES6模板字符串拼接:

        var name = "Kyle";
        var greeting = `Hello${name}!`;   //使用模板字符串,${}可以对变量取值。
        console.log(greeting);
        console.log(typeof greeting);

  字符使用``包裹,会被解释为一个字符串字面量,其中${}形式的表达式会被立即在线解析求值。

  1.3字符串字面量的一个优点,字符串可以分散在多行

        // text中的空格和换行会被保存
        var text = `
            Now is the time for all good men
            to come to the aid of their
            country!
        `;
        console.log(text);

  2.插入表达式${}

  2.1插入表达式中可以出现任何合法的表达式,包括函数调用、在线函数表达式调用,甚至其他插入字符串字面量!

        function upper(s) {
            return s.toUpperCase();
        }
        var who = "reader";
        var text = `
            A very ${upper("warm")} welcome
            to all of you ${upper(`${who}s`)}
            `;
        console.log(text);

  2.2插入表达式作用域

        function foo(str){
            var name = "foo";
            console.log(str);
        }
        function bar(){
            var name = "bar";
            foo(`Hello from ${name}!`);  //这里的name使用的是${name}所出现的作用域中的name
        }
        var name = "global";
        bar();              // Hello from bar

  插入字符串字面量在它出现的词法作用域内,没有任何形式的动态作用域。

  2.3标签模板字面量

  这个新功能不好解释,直接上代码比较直观:

        function foo(strings, ...values){
            console.log(strings);       //输出结果是数组,[‘Everything is‘, ‘!‘]
            console.log(values);        //输出结果是数组,[‘awesome‘]
        }
        var desc = ‘awesome‘;
        foo `Everything is ${desc}!`;

  上例中foo`Everything...`是什么?其实这是一类不需要(...)的特殊函数调用,标签也就是foo部分是一个要调用的函数值。可以是任意结果为函数的表达式。

        function bar() {
            return function foo(strings, ...values){
                console.log(strings);       //[‘Everything is‘, ‘!‘]
                console.log(values);        // [‘awesome‘]
            }
        }
        var desc = "awesome";
        bar()`Everything is ${desc}`;   //bar()的结果是一个函数

  分析:第一个参数strings为所有由普通字符串组成的数组。

       第二个参数values接收的是由插入表达式${}计算的结果值。

  应用:数字格式化为美元表示法

        function bar(strings, ...values) {
            return strings.reduce(function(s, v, idx){  //s表示上一次调用返回值,v表示当前元素之
                if(idx > 0){
                    if(typeof values[idx - 1] == ‘number‘){
                        s += `$${values[idx - 1].toFixed(2)}`;  //如果是数字,给其拼接上‘$‘符号。
                    } else {
                        s += values[idx - 1]
                    }
                }
                return s + v;
            }, "");     //""作为reduce第一次调用的第一个参数的值
        }
        var amt1 = 11.99;
            amt2 = amt1 * 1.08,
            name = "Kyle";
        var result = bar`
            Thanks for your purchase, ${amt1}! Your
            product cost was ${amt1}, which with tax
            comes out to ${amt2}.
        `;
        console.log(result)

  如果values中遇到number值,就在其前拼接‘$‘,然后使用toFixed(2)保留两位小数位。

  2.4原始字符串

  ES6提供了一个内建函数可以用作字符串字面量标签:String.raw(...)。得到字符串原始值。

        //结果我为‘Hello
        //World‘
        console.log(‘Hello\nWorld!‘);
        console.log(String.raw`Hello\nWorld!`); //结果为‘Hello\nWorld‘

原文地址:https://www.cnblogs.com/diweikang/p/8999152.html

时间: 2024-08-05 07:05:57

ES6新语法之---对象字面量扩展、模板字符串(5)的相关文章

ES6新语法概览

简介 ES6是JavaScript语言的新一代标准,加入了一些新的功能和语法,正式发布于2015年6月,亦称ES2015:该标准由ECMA(欧洲计算机制造联合会)的第39号技术专家委员会(TC39)制订,ES7正在制订中,据称会在2017年发布. 语法 箭头函数.this ES6中可以使用 => 作为函数表达形式,极简风格,参数+ => +函数体. var foo = function(){return 1;}; //等价于 let foo = () => 1; let nums = [

js学习日记-对象字面量

对象字面量语法 var person={ name:'小王', age:18, _pri:233 } 1.采用对象字面量方法创建的对象,不能采用var wang=new person()这样的方式来调用,要访问对象中的方法,直接使用person.xxx的形式 2.最后一个成员结尾不要用逗号,不然在某些浏览器中会抛出错误 对象成员配置 对象申明后,会默认为内部的每个成员(属性或方法)生成一些隐藏属性,这些隐藏属性是可以读取和可配置的: Object.getOwnPropertyDescriptor

js对象字面量属性间相互访问的问题 和 这个问题与执行环境的关系

对象字面量属性间无法相互访问的问题: 我曾经在定义一个对象时, 并出于复用性的考虑试图复用某些属性: // test 1 var person = { firstName : "Bill", lastName : "Gates", fullName : firstName + " " + lastName // 这里报错 } alert(person.firstName); alert(person.lastName); alert(person

Javascript——对象字面量常用写法以及规则

对象字面量 对象字面值是封闭在花括号对({})中的一个对象的零个或多个"属性名-值"对的(元素)列表.你不能在一条语句的开头就使用对象字面值,这将导致错误或产生超出预料的行为, 因为此时左花括号({)会被认为是一个语句块的起始符号. 以下是一个对象字面值的例子.对象car的第一个元素(译注:即一个属性/值对)定义了属性myCar:第二个元素,属性getCar,引用了一个函数(即CarTypes("Honda")):第三个元素,属性special,使用了一个已有的变量

JavaScript语言精粹1字符串,对象字面量

字符串 Strings JavaScript没有,字符,类型.仅包含一个字符的,字符串即可. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>testString1</title> <style type="text/css"></style> </hea

总结常见的ES6新语法特性

总结常见的ES6新语法特性 ES6给我们带来了更"甜"的语法糖(一种语法,使得语言更容易理解和更具有可读性,也让我们编写代码更加简单快捷),如箭头函数(=>).class等等.用一句话来说就是: ES6给我们提供了许多的新语法和代码特性来提高javascript的体验 不过遗憾的是,现在还没有浏览器能够很好的支持es6语法,点这里查看浏览器支持情况,所以我们在开发中还需要用babel进行转换为CommonJS这种模块化标准的语法. 因为下面我会讲到一些es6新特性的例子,如果想要

js对象字面量

js对象字面量 对象字面量的输出方式以及定义好处 1.对象字面量的输出方式有两种:传统的‘.’,以及数组方式,只不过用数组方式输出时,方括号里面要用引号括起来,如 var box = { name:’abc’; age:28 }; alert(box[‘name’]); 给对象定义方法, A:如果用传统定义对象的方式,就需要先定义方法,然后再把这个方法名赋值给对象的一个属性,如果要调用这个方法不加括号,就是返回方法代码:如果要调用这个方法该对象属性后面加上括号,就得到方法的返回值 functio

JavaScript对象字面量

<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <script type="text/javascript

对象字面量表示法

今天看书看到了一个没见过的词儿:对象字面量表示法,看过内容之后,发现这货就是Json,但又不仅仅是Json,于是好好的问了一番度娘,原来Json只是一个数组和对象字面量表示法的组合. 先说下数组的字面量表示法 数组其实也是对象,构造函数的方式创建数组方式如下: var myArr = new Array("妹妹","表妹","萝莉"); 字面量表示法(不知道这词儿之前,我一直这样写,推荐此写法): var myArr = ["妹妹&qu