JavaScript学习笔记(二)-刷题过程中遇到的问题
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’;
上述写法是不允许的,浏览器会报错,因为重复定义了。
- 正则表达式
正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。
搜索模式可用于文本搜索和文本替换。
语法
/正则表达式主体/修饰符(可选)
正则表达式有三个修饰符:
i | 执行对大小写不敏感的匹配。 |
---|---|
g | 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。 |
m | 执行多行匹配。 |
其他常用字符等。参考
- String.replace()
replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
该方法不会改变原始字符串。
string.replace(searchvalue,newvalue)
参数值
参数 | 描述 |
---|---|
searchvalue | 必须。规定子字符串或要替换的模式的 RegExp 对象。请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象。 |
newvalue | 必需。一个字符串值。规定了替换文本或生成替换文本的函数。 |
返回值
类型 | 描述 |
---|---|
String | 一个新的字符串,是用 replacement 替换了 regexp 的第一次匹配或所有匹配之后得到的。 |