JavaScript学习笔记(二)-刷题过程中遇到的问题

JavaScript学习笔记(二)-刷题过程中遇到的问题

Leetcode

929. Unique Email Addresses [Easy]

929. Unique Email Addresses [Easy]

Discuss: utkarsh_bharti

var numUniqueEmails = function(emails) {
    let res=[]
    for(let i=0;i<emails.length;i++){
        let idx = emails[i].indexOf('@')
        let localName = emails[i].slice(0,idx).replace(/[.]/g, '');
        if(localName.includes('+')){
            localName = localName.slice(0,localName.indexOf('+'))
        }
        let domainName =  emails[i].slice(idx)
        let email = localName.concat(domainName)
         if(!res.includes(email)){
             res.push(email)
        }
    }
    return res.length
};
  • indexOf()

    indexOf() 方法可返回数组中某个指定的元素位置。
    该方法将从头到尾地检索数组,看它是否含有对应的元素。开始检索的位置在数组 start 处或数组的开头(没有指定 start 参数时)。如果找到一个 item,则返回 item 的第一次出现的位置。开始位置的索引为 0。
    如果在数组中没找到指定元素则返回 -1。

  • let & var & const

    const: read only. 不能修改的是栈内存在的值和地址。
    使用var声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象;
    使用let声明的变量,其作用域为该语句所在的代码块内,不存在变量提升;

var存在的问题:

for (var i = 0; i < 3; i++) {
      setTimeout(function () {
        console.log(i)
      }, 1000);
 }
 // 3 3 3
 //循环本身及三次 timeout 回调均共享唯一的变量 i 。
 //当循环结束执行时,i 的值为3。所以当第一个 timeout 执行时,调用的 i 当让也为 3 了。

注意:必须声明 ‘use strict’ 后才能使用let声明变量,否则浏览并不能显示结果.
let是更完美的var
let声明的变量拥有块级作用域。
也就是说用let声明的变量的作用域只是外层块,而不是整个外层函数。let 声明仍然保留了提升特性,但不会盲目提升,在示例一中,通过将var替换为let可以快速修复问题,如果你处处使用let进行声明,就不会遇到类似的bug。
let声明的全局变量不是全局对象的属性
这就意味着,你不可以通过window.变量名的方式访问这些变量。它们只存在于一个不可见的块的作用域中,这个块理论上是Web页面中运行的所有JS代码的外层块。
形如for (let x…)的循环在每次迭代时都为x创建新的绑定。
这是一个非常微妙的区别,拿示例二来说,如果一个for (let…)循环执行多次并且循环保持了一个闭包,那么每个闭包将捕捉一个循环变量的不同值作为副本,而不是所有闭包都捕捉循环变量的同一个值。
所以示例二中,也以通过将var替换为let修复bug。
这种情况适用于现有的三种循环方式:for-of、for-in、以及传统的用分号分隔的类C循环。
用let重定义变量会抛出一个语法错误(SyntaxError)。
let a = ‘a’;
let a = ‘b’;
上述写法是不允许的,浏览器会报错,因为重复定义了。

Reference

  • 正则表达式
    正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。
    搜索模式可用于文本搜索和文本替换。

    语法
    /正则表达式主体/修饰符(可选)

    正则表达式有三个修饰符:
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。

其他常用字符等。参考

  • String.replace()
    replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
    该方法不会改变原始字符串。
    string.replace(searchvalue,newvalue)

    参数值
参数 描述
searchvalue 必须。规定子字符串或要替换的模式的 RegExp 对象。请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象。
newvalue 必需。一个字符串值。规定了替换文本或生成替换文本的函数。

返回值

类型 描述
String 一个新的字符串,是用 replacement 替换了 regexp 的第一次匹配或所有匹配之后得到的。

猜你喜欢

转载自blog.csdn.net/sinat_41918479/article/details/83956609