// Android
if (this.openApp(‘en://startapp’)) {
this.openApp(‘en://startapp’) // 通过Scheme协议打开指定APP
} else {
//跳转Android下载地址
}
} else if (u.indexOf(‘iPhone’) > -1) {
if (this.openApp(‘ios–scheme’)) {
this.openApp(‘ios–scheme’) // 通过Scheme协议打开指定APP
} else {
// 跳转IOS下载地址
}
}
},
openApp(src) {
// 通过iframe的方式试图打开APP,如果能正常打开,会直接切换到APP,并自动阻止a标签的默认行为
// 否则打开a标签的href链接
let ifr = document.createElement(‘iframe’)
ifr.src = src
ifr.style.display = ‘none’
document.body.appendChild(ifr)
window.setTimeout(function() {
// 打开App后移出这个iframe
document.body.removeChild(ifr)
}, 2000)
}
数组去重
var array = [1, 2, 1, 1, ‘1’];
function unique(array) {
var obj = {};
return array.filter(function(item, index, array){
return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
})
}
console.log(unique(array)) //[1, 2, “1”]
交换数组指定位置元素位置
var array = [1, 2, 3, 4];
// x , y是要交换元素的位置(index+1)
function arrIndexExchange(array, x, y){
array.splice(x - 1, 1, …array.splice(y - 1, 1, array[x - 1]));
return array;
};
console.log(arrIndexExchange(array, 1, 4)) //[4, 2, 3, 1]
输出是什么
function sayHi() {
console.log(name)
console.log(age)
var name = ‘Lydia’
let age = 21
}
sayHi() // undefined 和 ReferenceError
在函数内部,我们首先通过 var 关键字声明了 name 变量。这意味着变量被提升了(内存空间在创建阶段就被设置好了),直到程序运行到定义变量位置之前默认值都是 undefined。因为当我们打印 name 变量时还没有执行到定义变量的位置,因此变量的值保持为 undefined。
通过 let 和 const 关键字声明的变量也会提升,但是和 var 不同,它们不会被初始化。在我们声明(初始化)之前是不能访问它们的。这个行为被称之为暂时性死区。当我们试图在声明之前访问它们时,JavaScript 将会抛出一个 ReferenceError 错误。
输出是什么
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1)
}
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1)
}
// 3 3 3 和 0 1 2
由于 JavaScript 的事件循环,setTimeout 回调会在遍历结束后才执行。因为在第一个遍历中遍历 i 是通过 var 关键字声明的,所以这个值是全局作用域下的。在遍历过程中,我们通过一元操作符 ++ 来每次递增 i 的值。当 setTimeout 回调执行的时候,i 的值等于 3。
在第二个遍历中,遍历 i 是通过 let 关键字声明的:通过 let 和 const 关键字声明的变量是拥有块级作用域(指的是任何在 {} 中的内容)。在每次的遍历过程中,i 都有一个新值,并且每个值都在循环内的作用域中。
输出是什么
const shape = {
radius: 10,
diameter() {
return this.radius * 2
},
perimeter: () => 2 * Math.PI * this.radius
}
shape.diameter()
shape.perimeter() //20 and NaN
注意 diameter 的值是一个常规函数,但是 perimeter 的值是一个箭头函数。
对于箭头函数,this 关键字指向的是它当前周围作用域(简单来说是包含箭头函数的常规函数,如果没有常规函数的话就是全局对象),这个行为和常规函数不同。这意味着当我们调用 perimeter 时,this 不是指向 shape 对象,而是它的周围作用域(在例子中是 window)。
在 window 中没有 radius 这个属性,因此返回 undefined。
输出是什么?
+true;
!“Lydia”;
//1 and false
一元操作符加号尝试将 bool 转为 number。true 转换为 number 的话为 1,false 为 0。
字符串 ‘Lydia’ 是一个真值,真值取反那么就返回 false。
哪一个是无效的?
const bird = {
size: ‘small’
}
const mouse = {
name: ‘Mickey’,
small: true
}
A: mouse.bird.size
B: mouse[bird.size]
C: mouse[bird[“size”]]
D: All of them are valid
//A: mouse.bird.size
在 JavaScript 中,所有对象的 keys 都是字符串(除非对象是 Symbol)。尽管我们可能不会定义它们为字符串,但它们在底层总会被转换为字符串。
当我们使用括号语法时([]),JavaScript 会解释(或者 unboxes)语句。它首先看到第一个开始括号 [ 并继续前进直到找到结束括号 ]。只有这样,它才会计算语句的值。
mouse[bird.size]:首先计算 bird.size,这会得到 small。mouse[“small”] 返回 true。
然后使用点语法的话,上面这一切都不会发生。mouse 没有 bird 这个 key,这也就意味着 mouse.bird 是 undefined。然后当我们使用点语法 mouse.bird.size 时,因为 mouse.bird 是 undefined,这也就变成了 undefined.size。这个行为是无效的,并且会抛出一个错误类似 Cannot read property “size” of undefined。
输出什么?
console.log(Number(2) === Number(2))
console.log(Boolean(false) === Boolean(false))
console.log(Symbol(‘foo’) === Symbol(‘foo’))
-
A:
true
,true
,false
-
B:
false
,true
,false
-
C:
true
,false
,true
-
D:
true
,true
,true
每个Symbol
都是完全唯一的。传递给Symbol
的参数只是给Symbol
的一个描述。 Symbol
的值不依赖于传递的参数。 当我们测试相等时,我们创建了两个全新的符号:第一个Symbol('foo')
,第二个Symbol('foo')
, 这两个值是唯一的,彼此不相等,因此返回false
。
以下是个纯函数么?
function sum(a, b) {
return a + b;
}
-
A: Yes
-
B: No
答案: A
纯函数一种若输入参数相同,则永远会得到相同输出的函数。
sum
函数总是返回相同的结果。 如果我们传递1
和2
,它将总是返回3
而没有副作用。 如果我们传递5
和10
,它将总是返回15
,依此类推,这是纯函数的定义。
输出什么?
const myLifeSummedUp = [“☕”, “?”, “?”, “?”]
for (let item in myLifeSummedUp) {
console.log(item)
}
for (let item of myLifeSummedUp) {
console.log(item)
}
-
A:
0
1
2
3
and"☕"
"?"
"?"
"?"
-
B:
"☕"
"?"
"?"
"?"
and"☕"
"?"
"?"
"?"
-
C:
"☕"
"?"
"?"
"?"
and0
1
2
3
-
D:
0
1
2
3
and{0: "☕", 1: "?", 2: "?", 3: "?"}
答案: A
通过for-in
循环,我们可以遍历一个对象自有的、继承的、可枚举的、非Symbol的属性。 在数组中,可枚举属性是数组元素的“键”, 即它们的索引。 类似于下面这个对象:
{0: "☕", 1: "?", 2: "?", 3: "?"}
其中键则是可枚举属性,因此 0
,1
,2
,3
被记录。
通过for-of
循环,我们可以迭代可迭代对象(包括 Array
,Map
,Set
,String
,arguments
等)。当我们迭代数组时,在每次迭代中,不同属性的值将被分配给变量item
, 因此“☕”
,“?”
,“?”
,“?”
被打印。
输出什么?
const list = [1 + 2, 1 * 2, 1 / 2]
console.log(list)
-
A:
["1 + 2", "1 * 2", "1 / 2"]
-
B:
["12", 2, 0.5]
-
C:
[3, 2, 0.5]
-
D:
[1, 1, 1]
答案: C
数组元素可以包含任何值。 数字,字符串,布尔值,对象,数组,null
,undeifned
, 以及其他表达式,如日期,函数和计算。
元素将等于返回的值。 1 + 2
返回3
,1 * 2
返回’2,'1 / 2
返回0.5
。
输出什么?
function sayHi(name) {
return Hi there, ${name}
}
console.log(sayHi())
-
A:
Hi there,
-
B:
Hi there, undefined
-
C:
Hi there, null
-
D:
ReferenceError
答案: B
默认情况下,如果不给函数传参,参数的值将为undefined
。 上述情况,我们没有给参数name
传值。 name
等于undefined
,并被打印。
在ES6中,我们可以使用默认参数覆盖此默认的undefined
值。 例如:
function sayHi(name =“Lydia”){...}
在这种情况下,如果我们没有传递值或者如果我们传递undefined
,name
总是等于字符串Lydia
输出什么?
const person = {
name: “Lydia”,
age: 21
}
let city = person.city
city = “Amsterdam”
console.log(person)
-
A:
{ name: "Lydia", age: 21 }
-
B:
{ name: "Lydia", age: 21, city: "Amsterdam" }
-
C:
{ name: "Lydia", age: 21, city: undefined }
-
D:
"Amsterdam"
答案: A
我们将变量city
设置为等于person
对象上名为city
的属性的值。 这个对象上没有名为city
的属性,因此变量city
的值为undefined
。
请注意,我们没有引用person
对象本身,只是将变量city
设置为等于person
对象上city
属性的当前值。
然后,我们将city
设置为等于字符串“Amsterdam”
。 这不会更改person对象:没有对该对象的引用。
因此打印person
对象时,会返回未修改的对象。
输出什么?
function checkAge(age) {
if (age < 18) {
const message = “Sorry, you’re too young.”
} else {
const message = “Yay! You’re old enough!”
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-D7EHhCkU-1715539218298)]
[外链图片转存中…(img-mfIFhxYD-1715539218298)]
[外链图片转存中…(img-HsyKbd1a-1715539218299)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!