幾道比較有意思的js面試題

1、[] ? !![] : ![];輸出結果是什么?

1
2
3
4
5
let?val?=?[]???!![]?:?![];
console.log(val);?
//true:
//之前的錯誤解釋:[]?是一個null,做判斷則為false,false執行![]語句,結果為非空,即true
//更正:[]是一個object,object判斷為true(null實際上也是一個object不過比較特殊是6種false之一),true執行?!![]?兩次取反為true.多謝@此生只為你傾心指正。

這里順便說明一下,js用于做判斷,只有以下6種情況判斷出來的值為false:

值為false:????false????0????null????""(空字符串)????undefined????NaN? ?

其他均為true。

延展一下,有個比較有意思的情況是:[] == ![]; //true,

還有[]我們剛剛判斷為true對吧? 但是呢 [] == false;? //true,

為什么呢?

==?:趨向于先轉換成0和1再做判斷,一起來看看吧

????? ? 先看[] == false首先把比較的雙方轉成number(雙方有一方是布爾值),[]是空數組,轉換成基本類型為"",空所以被轉化為0,false也被轉成0。0 == 0,true(不過如果用恒等于 ===則為false,因為兩者數據類型不一致,[]為object(里的array),false為布爾值)

????????再看[] == ![]; []是object即true,!true ==> false;? false ==> 0; 而[]我們知道最終轉化為0,所以 0 == 0; //true;

????????[] == [] 實際上是false哈。是不是很別扭?

所以:慎用 "==",用“===”

2、下面代碼輸出什么?

1
2
3
4
let?k;
for(let?i?=?0,j?=?0;i?<?10,j?<?8;?i++,?j++){
??k?=?i?+?j;
}

????????答案是:14。這里的i和j是同步增長,當j加到7的時候,i也等于7,k執行等于14,j再加1,不滿足條件,跳出循環,結果為14,如果再問i和j的值,則都為8。

3、有這樣一串雜亂無章的數據————dahsidoai 213907;a? poas198jdo 213089 as13d115。

? ? ? 我希望它輸出["213907", "198", "213089", "13", "115"],請寫出實現過程

1
2
3
4
5
6
7
8
9
10
11
12
let?str?=?"dahsidoai?213907;a??poas198jdo?213089?as13d115";
function?searchNumUnit(str){
??let?arr?=?[],
?????str0?=?str,?//不影響原數據
?????reg?=?/\d+/;
??while(reg.test(str0)){
????arr.push(reg.exec(str0)[0]);
????str0?=?str0.split('').slice(reg.exec(str0).index?+?reg.exec(str0)[0].length,str0.length).join('');
??}
??return?arr;
}
console.log(searchNumUnit(str));

第2種方法,利用js的match函數提取字符串:

1
2
let?str?=?"dahsidoai?213907;a??poas198jdo?213089?as13d115";
console.log(str.match(/\d+/g));//感謝慕姐704907

4、下面是一道綜合題,問題會由淺及深一步步問,你需要一步步解決:

????????下面的程序輸出什么?假如說我用"==>"表示程序延遲了多久輸出,比如1,2 ==> 3 ,表示12同時輸出,之后間隔1000ms(為避免鉆牛角尖,這里的1000只是一個大概數)輸出了3

1
2
3
4
5
6
for(var?i?=?0;?i?<?6;?i?++){
??setTimeout(function(){
????console.log(i);
??},1000);
}
//?輸出結果:6,6,6,6,6,6

那我如果想輸出0 , 1 , 2 , 3 , 4 , 5呢?得怎么寫?能否通過多種方式來寫出?(最少2種)

1
2
3
4
5
6
7
8
//第1種方式:
for(var?i?=?0;?i?<?6;?i?++){
??(function(j){
????setTimeout(function(){
??????console.log(j);
????},1000);
??})(i)
}
1
2
3
4
5
6
7
//第2種方式:
for(let?i?=?0;?i?<?6;?i?++){
??setTimeout(function(){
????console.log(i);
??},1000);
}
//輸出結果:0?,?1?,?2?,?3?,?4?,?5

那我如果是想輸出0 ==> 1 ==> 2 ==> 3 ==> 4 ==> 5程序得怎么改變?

1
2
3
4
5
6
7
8
//?代碼如下:
for(var?i?=?0;?i?<?6;?i?++){
??(function(j){
????setTimeout(function(){
??????console.log(j);
????},1000?*?j);
??})(i)
}

???????上面這種代碼能實現邏輯,但代碼太爛,沒法給你加分,有沒有更好的辦法?另外我為什么說你的代碼太爛?能順便說明一下嗎?

1
2
3
4
5
6
7
//首先我的代碼太爛是因為我創建了太多的定時器,僅僅這里我就創建了6個定時器,如果i值非常大,會非常消耗資源,大大降低執行性能
//優化代碼如下:這里的好處是即使你的i1值達到10000甚至1億,我始終只有1個定時器。
let?i1?=?0;
let?time?=?setInterval(output_i1,1000);
function?output_i1(){
??i1?<?6???console.log("i1="?+?i1++)?:?clearInterval(time);
}

????????這樣算可以給你加5分,如果我不是0 , 1 , 2 , 3 , 4 , 5呢?而是0,1,2,3,4,5...簡單的說能否給我自定義?

這個簡單啊,改成這樣不就可以了?

1
2
3
4
5
let?i1?=?0;
let?time?=?setInterval(output(6),1000);
function?output(num){
??i1?<?num-1???console.log(++i1)?:?clearInterval(time);
}

????????可惜你這個函數是錯的,setInterval接收的是一個function:output,而不是接收一個已經運行的output(),所以呢?你得怎么改?

1
2
3
4
5
6
7
8
9
10
11
//改成這樣:
let?i2?=?0;
let?time1?=?setInterval(_output_i2(8),1000);
function?_output_i2(num){
??return?function(){
????output_i2(num);
??}
}
function?output_i2(num){
??i2?<?num???console.log("i2="+?i2++)?:?clearInterval(time1);
}

????????如果你到了這一步,嗯,還行,勉強達到了基本要求,但是呢,其實這里涉及到異步,用promise又得怎么寫?還能再進一步嗎?答案是肯定的,不過呢,先答下一題吧。

?

5、這是一道簡單的數據處理題

一個樹形json數據有3層,基本的結構如下:(...代表后續有若干個類似的對象)

數據大概是這樣:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[
??{
????id?:?"1",
????name?:?"dorsey1",
????children:?[
??????{
????????id?:?"1-1",
????????name?:?"dorsey1-1",
????????children?:?[
??????????{
????????????id?:?"1-1-1",
????????????name?:?"dorsey1-1-1",
????????????children?:?[
??????????????{
????????????????id?:?"1-1-1-1",
????????????????name?:?"dorsey1-1-1-1",
??????????????}
?????????????...
????????????]
??????????}
????????...
????????]
??????}
?????...
????]
??}
?...
]

請寫一個函數傳入id值返回name值,另外呢?這里雖說只是3層,能否拓展到若干層?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
let?data?=?[
??{
??id?:?"1",
??name?:?"dorsey1",
??children:?[
????{
??????id?:?"1-1",
??????name?:?"dorsey1-1",
??????children?:?[
????????{
??????????id?:?"1-1-1",
??????????name?:?"dorsey1-1-1",
??????????children?:?[
????????????{
??????????????id?:?"1-1-1-1",
??????????????name?:?"dorsey1-1-1-1",
????????????}
??????????]
????????},
????????{
??????????id?:?"1-1-2",
??????????name?:?"dorsey1-1-2"
????????}
??????]
????},
????{
??????id?:?"1-2",
??????name?:?"dorsey1-2",
??????children?:?[
????????{
??????????id?:?"1-2-1",
??????????name?:?"dorsey1-2-1"
????????},
????????{
??????????id?:?"1-2-2",
??????????name?:?"dorsey1-2-2"
????????}
??????]
????},
????{
??????id?:?"1-3",
??????name?:?"dorsey1-3",
??????children?:?[
????????{
??????????id?:?"1-3-1",
??????????name?:?"dorsey1-3-1"
????????},
????????{
??????????id?:?"1-3-2",
??????????name?:?"dorsey1-3-2"
????????}
??????]
????}
????]
??},
??{
????id?:?"2",
????name?:?"dorsey2",
????children:?[
??????{
????????id?:?"2-1",
????????name?:?"dorsey2-1",
????????children?:?[
??????????{
????????????id?:?"2-1-1",
????????????name?:?"dorsey2-1-1"
??????????},
??????????{
????????????id?:?"2-1-2",
????????????name?:?"dorsey2-1-2"
??????????}
????????]
??????},
??????{
????????id?:?"2-2",
????????name?:?"dorsey2-2",
????????children?:?[
??????????{
????????????id?:?"2-2-1",
????????????name?:?"dorsey2-2-1"
??????????},
??????????{
????????????id?:?"2-2-2",
????????????name?:?"dorsey2-2-2"
??????????}
????????]
??????}
????]
??}
]

這是基本的json解析,請看下面的實現:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//最原始的實現如下:
function?getJsonDataNameById(dataArr,id)?{
??let?agent?=?[];
??let?data?=?dataArr,
??len?=?data.length;
??for?(let?i?=?0;?i?<?len;?i++)?{
????let?item?=?data[i];
????if(item.children?&&?item.children.length?!==?0){
??????for(let?j?=?0?;?j?<?item.children.length;?j?++){
????????agent.push(item.children[j]);
??????}
??????data?=?data.concat(agent);?//children降維
??????len?+=?agent.length;
??????agent?=?[];
????}
??}
??for(let?i?=?0;?i?<?data.length;?i++){
????if(data[i].id?===?id){
??????return?data[i].name;
????}
??}
}
let?a?=?getJsonDataNameById(data,?"1-3-2");
console.log(a);


作者:dorseyCh
鏈接:https://www.imooc.com/article/48993
來源:慕課網
本文原創發布于慕課網 ,轉載請注明出處,謝謝合作

轉載于:https://www.cnblogs.com/justBobo/p/10740542.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249110.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249110.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249110.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

wepy - 與原生有什么不同(x.wpy)使用實例

源碼 1 <template>2 <view classmark wx:if"{{showMark}}">3 <view animation"{{animationData}}" class"animCat">4 <image src"http://osk1hpe2y.bkt.clouddn.com/18-5-30/34559443.jpg"></…

vue從入門到精通之高級篇(一)vue-router的高級用法

今天要介紹的是路由元信息&#xff0c;滾動行為以及路由懶加載這幾個的使用方法。 1.路由元信息 什么是路由元信息&#xff0c;看看官網的解釋&#xff0c;定義路由的時候可以配置 meta 字段可以匹配meta字段&#xff0c;那么我們該如何使用它&#xff0c;一個簡單的例子&…

Java 數組實現堆棧操作

class Stack {private int stck[] ; private int tos ; Stack(int size) { // 一個參數的構造參數stck new int[size] ; // 創建數組&#xff08;創建堆棧&#xff09;tos -1 ; // 空堆棧標識 -1}// 堆棧操作的特性&#xff1a;先進后出、后進先出void push(int…

re模塊

什么是正則表達式 一組特殊符號組成的表達式&#xff0c;用于描述某種規則。該應用場景生活中隨處可見。 例如&#xff1a;讓有志青年過上體面的生活&#xff0c;這里面就由規則&#xff0c;即有志青年。 正則表達式的作用&#xff0c;以及使用場景 用于從字符串中匹配滿足某種…

CSS實現div梯形分割

原理 使用的border邊框屬性結合svg 轉換 詳見代碼 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>css實現div邊框斜角</title><style type"text/css"> .labels {display: i…

算法學習——決策單調性優化DP

update in 2019.1.21 優化了一下文中年代久遠的代碼 的格式…… 什么是決策單調性&#xff1f; 在滿足決策單調性的情況下&#xff0c;通常決策點會形如1111112222224444445555588888..... 即不可能會出現后面點的決策點小于前面點的決策點這種情況。 那么這個性質應該如何使用…

SVG畫一個箭頭

參考菜鳥手冊&#xff1a; https://www.runoob.com/svg/svg-tutorial.html 打開菜鳥中的在線工具 在可視化截圖拖拉元素繪制箭頭 點擊command U 查看源碼 將源碼拷入html代碼中&#xff0c;查看效果 最后&#xff0c;貼出源碼供大家參考 <!DOCTYPE html> <…

HP Instant Information

HP Instant Information before HP-UX 11i v3 《管理系統和工作組&#xff1a;HP-UX系統管理員指南》 After HP-UX 11i v3 《HP-UX系統管理指南》(由多個文檔組成的文檔集) 《HP-UX系統管理員指南&#xff1a;概述》 《HP-UX系統管理員指南&#xff1a;配置管理》 《HP-UX系統管…

CodeForces 258D Little Elephant and Broken Sorting(期望)

CF258D Little Elephant and Broken Sorting 題意 題意翻譯 有一個\(1\sim n\)的排列&#xff0c;會進行\(m\)次操作&#xff0c;操作為交換\(a,b\)。每次操作都有\(50\%\)的概率進行。 求進行\(m\)次操作以后的期望逆序對個數。 \(n,m\le 1000\) 輸入輸出格式 輸入格式&#x…

記一次vue項目yarn打包環境配置失效的解決方案

項目中使用到了yarn打包工程&#xff0c;主要有以下幾個命名。 # build for production with minification yarn run build# build for production and view the bundle analyzer report yarn run build --report# 自定義API地址 baseurl"http://127.0.0.1:8080/api/&quo…

數字簽名與HTTPS詳解

因為HTTP協議本身存在著明文傳輸、不能很好的驗證通信方的身份和無法驗證報文的完整性等一些安全方面的確點&#xff0c;所以才有了HTTPS的缺陷。HTTPS確切的的說不是一種協議&#xff0c;而是HTTP SSL (TSL)的結合體。HTTP報文經過SSL層加密后交付給TCP層進行傳輸。SSL(安全套…

[BZOJ4320][ShangHai2006]Homework(根號分治+并查集)

對于<sqrt(300000)的詢問&#xff0c;對每個模數直接記錄結果&#xff0c;每次加入新數時暴力更新每個模數的結果。 對于>sqrt(300000)的詢問&#xff0c;枚舉倍數&#xff0c;每次查詢大于等于這個倍數的最小數是多少&#xff0c;這個操作通過將詢問逆序使用并查集支持。…

VScode 結局插件prettier和vetur格式化沖突

先上配置代碼 {"workbench.iconTheme": "vscode-icons","workbench.startupEditor": "newUntitledFile","workbench.colorTheme": "One Dark Pro","editor.fontSize": 14,"editor.tabSize":…

WPF效果(GIS三維續篇)

去年這個時候簡單的摸索了一下三維的GIS相關的東西,也就是僅僅玩耍了一把,這次來點真正用的上的干貨效果效果&#xff1a; 1、加載自定義百度樣式的瓦片效果 2、加載自定義百度樣式的縮放效果 3、快速手動進去咱的大帝都 4、加載海量Mark效果 5、加載海量Mark和簡單模型效果 6、…

vue 表單 驗證 async-validator

1、使用插件async-validator async-validator 地址&#xff1a;https://github.com/yiminghe/async-validator 2、示例&#xff08;vueelement-ui&#xff09; <el-form :model"numberValidateForm" ref"numberValidateForm" label-width"100px&qu…

[19/04/23-星期二] GOF23_創建型模式(工廠模式、抽象工廠模式)

一、工廠模式(分為&#xff1a;簡單工廠模式、工廠方法模式、抽象工廠模式) 實現了創建者和調用者的分離 核心本質&#xff1a;1、實例化對象&#xff0c;用工廠方法代替new操作&#xff1b;2、將選擇實現類、創建對象統一管理和控制&#xff0c;從而將調用者跟實現類解耦。 簡…

Chrome瀏覽器12px問題-webkit-text-size-adjust: none 已失效的解決方案

對于早期的chrome, 如果要想顯示12px以下的字體&#xff0c;一般通用的方案都是在對應的元素中添加 div {-webkit-text-size-adjust: none; }但是我今天遇到的需求&#xff0c;添加了之后沒有反應&#xff0c;而且瀏覽就根本不支持這種寫法。 在網上看到了博客《Chrome瀏覽器…

CSRFGuard工具介紹

理解CSRFGuard的基礎&#xff1a;http://www.runoob.com/jsp/jsp-tutorial.html 1&#xff1a;您需要做的第一件事是將OWASP.CSRFARGAD.JAR庫復制到類路徑中。放置Owasp.CsrfGuard.jar最常見的類路徑位置在Web應用程序的WEB-INF文件夾的lib目錄中。 OWASP CSRFGARD 3在傳統Java…

[19/04/24-星期三] GOF23_創建型模式(建造者模式、原型模式)

一、建造者模式 本質&#xff1a;分離了對象子組件的單獨構造(由Builder負責)和裝配的分離(由Director負責)&#xff0c;從而可以構建出復雜的對象&#xff0c;這個模式適用于&#xff1a;某個對象的構建過程十分復雜 好處&#xff1a;由于構建和裝配的解耦&#xff0c;不同的構…

深入理解vue中的slot與slot-scope

寫在前面 vue中關于插槽的文檔說明很短&#xff0c;語言又寫的很凝練&#xff0c;再加上其和methods&#xff0c;data&#xff0c;computed等常用選項在使用頻率、使用先后上的差別&#xff0c;這就有可能造成初次接觸插槽的開發者容易產生“算了吧&#xff0c;回頭再學&#…