【前端一题】字符串字节长度、字符数量、指定索引字符

108 阅读2分钟

跟大家一起每天进步一丢丢,在学习的路途上不掉队。

[ 经典题 ] 请编写三个API,统计字符串'123你abc好👦👉😄def呀456'中字符数量、字节长度、获取指定索引(码位/字符对应的索引)的字符。

const str = '123你abc好👦👉😄def呀456';
// 获取字符串中字符数量

// 获取字符串中字节长度

// 获取指定索引的字符,例如:getCharAt(str, 9)为👉
  • 试题参考答案跟第二天试题一起更新。
  • 希望大家积极参与和讨论。

【前端一题】try...catch与JS预编译结合,参考解析:

(function() {
    try {
        throw new Error();
    } catch (x) {
        var x = 1,
            y = 2;
        console.log(x); // 1
    }

    console.log(x); // undefined
    console.log(y); // 2
})();

/**
涉及知识:JS引擎执行代码原理,以V8引擎为准。
JS代码执行步骤:
step1:语法分析(通篇扫描,检测是否有低级的语法错误,此时代码并未执行)
step2:预编译(分为全局预编译、函数预编译,目的产生执行期上下文对象(作用域),加入JS执行栈中,为JS代码的执行提供环境)
step3:解析执行

重点看step2:预编译

1、全局预编译:在全局代码执行的前一刻,生成GO(Global Object)对象,指向所在环境的全局对象
普及知识: 
    - 每个函数都存在一个[[Scopes]]属性,此属性存放函数定义时和执行时一个一个的作用域,成链式结构,因此称之为作用域链。此属性是私有的,仅限于JS引擎内访问。
    - 作用域链顶端始终指向所在环境的作用域(with操作除外,它可以更改作用域链顶端指向)。
    - 函数定义位置决定了函数定义时,继承的作用域链。
    - 函数预编译生成的作用域对象,在函数作用域链的顶端。
    - 变量查找,从当前环境的作用域链顶端往下查找。

2、函数定义时[[Scopes]]值:
    0: GO
3、函数执行时,预编译生成AO对象:
    {
        ...,
        x: undefined,
        y: undefined
    }
  [[Scopes]]值:
    0:AO
    1:GO
4、解析执行代码
    - 执行try代码块中代码,throw 抛出错误,并被捕获。
    - 执行catch代码块中代码,将抛出的错误对象,传递给x
        x = 错误对象; // 此x并非,AO对象中的x属性
        x = 1; // 进行变量查找,此x非AO对象中的x属性
        y = 2; // 进行变量查找,此y即AO对象中的y属性
        console.log(x); // 1
    - 此时AO
        {
            ...,
            x: undefined,
            y: 2
        }
    - 继续往下
        console.log(x); // undefined
        console.log(y); // 2
*/

专注于原创短更,便于碎片化涉猎知识。希望我走过的路,留下的痕迹,能对你有所启发和帮助。

转发请注明原处,平台投稿请私信。