JS學習筆記91-97(面試題,數組API,字符串操作)

91課:面試題。


1.局部變量和全局變量
    f2();
    console.log(cc); // 9
    console.log(bb); // 9
    console.log(aa); //錯誤
    function f2(){
        var aa = bb = cc = 9;
        console.log(aa); // 9
        console.log(bb); // 9
        console.log(cc); // 9
    };
2.作用域提升
    var a = 123;
    f1();
    function f1(){
        //var a;
        var b=456;
        console.log(a); // undefined
        console.log(b); // 456
        var a = '12306';//會把var a;提升
    }
3.運算符和運算符的優先級別

一元操作符:++,--,+,-
邏輯操作符:!, &&, ||
基本運算符:+,-,,/,%
關系操作符:>,<,>=,<=,===,==,!==,!=
條件運算符:a? b : c;
賦值運算符:+=,-+,
=,/=,%=
逗號運算符:,

優先級
第一位: ()
第二位: |,-,+,++,--.(這里的-+是一元運算符)
第三位: *,/,%
第四位: +,-
第五位: <,<=,>,>=
第六位: ==,!=,===,!==
第七位: &&
第八位: ||
第九位: a? b : c;
第十位: =,+=,-=,*=,/=,%=
   面試題
    var aa = 0&&1;
    alert(aa); // 0
    var bb =  1&&0;
    alert(bb); // 0
    var cc =  1&&8;
    alert(cc); // 8

    var a = 1 && 3 && 5;
    alert(a); // 5
    var b = 0 && 2 && 4;
    alert(b); // 0
    var c = 5 && 0  && 7;
    alert(c); // 0

    console.log(0||1); // 1
    console.log(1||0); // 1
    console.log(1||3); // 1
    console.log(3||1); // 3

    var a = 5 && 0 || 1; // 1
    var b = 4 || 0 &&  8; // 4
    var c= 0 || 8 && 9;  // 9
    alert(a),alert(b),alert(c);

    var a = 4 + 8 && 3; // 3
    var b = 0 && 7 + 1; // 0
    var c = 4 || 3 && 8-1; // 4
    alert(a),alert(b),alert(c);

92課:數組常用API補充


一.Array的內置方法

1.Instanceof

是一個關鍵字,判斷A是否是B類型。
布爾類型值 = A Instanceof B
運算符用來測試一個對象在其原型鏈中是否存在一個構造函數的 prototype 屬性。
和typeOf比較(typeof作用:用于判斷一個一個表達式,(對象或者原始值),返回一個字符串。返回的可能的值)

  • typeof判斷所有變量的類型,返回值有number,boolean,string,function,object,undefined。
  • typeof對于豐富的對象實例,只能返回"Object"字符串。
  • instanceof用來判斷對象,代碼形式為obj1 instanceof obj2(obj1是否是obj2的實例),obj2必須為對象,否則會報錯!其返回值為布爾值。
  • instanceof可以對不同的對象實例進行判斷,判斷方法是根據對象的原型鏈依次向下查詢,如果obj2的原型屬性存在obj1的原型鏈上,(obj1 instanceof obj2)值為true。
2.Array.isArray()

H5新增,判斷是不是數組。
布爾類型值 = Array.isArray(變量);
調用者:Array 參數:變量(被檢測值) 返回值:布爾類型

3.toString()

把數組轉化成字符串,每一項用 , 分割。
字符串 = 數組.toString();

4.valueOf()

返回數組對象本身。數組本身 = 數組.valueOf()

5.join()

用于把數組中的所有元素放入一個字符串。元素是通過指定的分隔符進行分隔的。
字符串 = 數組.join(分隔符);
分隔符可以有也可以沒有,不寫默認用逗號分割,無縫連接用空字符串。

//1. Instanceof
    var arr = [1, 2, "哈哈哈"]; // Array
    console.log(typeof arr); // object
    console.log(arr instanceof Array);
//2. Array.isArray()
    var arr1 = [1, 2, "哈哈哈"];
    var arr2 = new Array();
    var name = "jack";
    console.log(Array.isArray(arr1));
    console.log(Array.isArray(arr2));
    console.log(Array.isArray(name));
//3. toString()
     var arr = [1, 2, "哈哈哈", 212121, 323232];
    console.log(arr.toString());
    console.log(typeof arr.toString()); // string
//4.valueOf()
     console.log(arr.valueOf());
//5. indexOf()、lastIndexOf()
    var arr = [1, 2, 33, 2, 1];
    console.log(arr.indexOf(2));
    console.log(arr.indexOf(12));
    console.log(arr.lastIndexOf(2));
    console.log(arr.lastIndexOf(22));

二.數組增刪和換位置(原數組將被修改)

微信圖片_20181224003128.png
indexOf

從前向后索引字符串位置(參數:索引字符串)
從前面尋找第一個符合元素的位置,找不到則返回-1。

lastIndexOf

從后向前索引字符串位置(參數:索引字符串)
從后面尋找第一個符合元素的位置,找不到則返回-1;

map()

方法定義在JavaScript的Array中,我們調用Array的map()方法,傳入我們自己的函數,就得到了一個新的Array作為結果

reduce()

reduce的用法。Array的reduce()把一個函數作用在這個Array的[x1, x2, x3...]上,這個函數必須接收兩個參數,reduce()把結果繼續和序列的下一個元素做累積計算,其效果就是:

[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)
###### `=>`是[es6語法](https://github.com/lukehoban/es6features)中的`arrow function`
舉例:
(x) => x + 6;
相當于
function(x){
    return x + 6;
}
item定義和用法

item() 方法節點列表中位于指定索引的節點。

以下兩條語法產生相同的結果:
document.body.childNodes.item(0);
document.body.childNodes[0];
sort()

為sort()中傳入排序規則函數可實現自定義排序
排序函數規則:

傳兩個形參
當返回值為正數時,交換傳入兩形參在數組中位置
排序的內置算法:
JS中sort實現算法居然是O(n^2)的冒泡排序,所以有時候有必要自己實現那些算法

93-96課:JS特效-字符串操作補充


1.轉換成字符串(三種方法)
//+  toString()   String()
    var str = '張三';
    var age = 18;
    console.log(typeof str); // string
    console.log(typeof (age + ''));
    console.log(typeof age.toString());
    console.log(typeof String(age));
2.根據位置返回字符串
charAt

獲取相應位置字符(參數:字符位置)。
字符串中第一個字符的下標是0,如果參數index不再0與string.length之間,將返回一個空字符串。
獲取相應位置的字符(參數:索引值)。

charCodeAt

獲取相應位置字符編碼。
兩個方法都用于選取字符串中某一位置上的單個字符。
區別:charCodeAt()方法返回字符在Unicode字符集中的編碼值。

    var str = "a,Hello World";
    var str1 = "你好,中國!";
    console.log(str.charAt(1));
    console.log(str.charAt(7));
    console.log(str1.charAt(4));

    console.log(str.charCodeAt(0));
    console.log(str1.charCodeAt(0));
Unicode

(統一碼、萬國碼、單一碼)是計算機科學領域里的一項業界標準,包括字符集、編碼方案等。Unicode 是為了解決傳統的字符編碼方案的局限而產生的,它為每種語言中的每個字符設定了統一并且唯一的二進制編碼,以滿足跨語言、跨平臺進行文本轉換、處理的要求。1990年開始研發,1994年正式公布。

  • 能夠使計算機實現跨語言、跨平臺的文本轉換及處理。
ASCII

ASCII 是用來表示英文字符的一種編碼規范。每個ASCII字符占用1 個字節,因此,ASCII 編碼可以表示的最大字符數是255(00H—FFH)。這對于英文而言,是沒有問題的,一般只什么用到前128個(00H--7FH,最高位為0)。而最高位為1 的另128 個字符(80H—FFH)被稱為“擴展ASCII”,一般用來存放英文的制表符、部分音標字符等等的一些其它符號。

  1. ASCII:8bits的英文編碼,實際使用低7位,127個字符。32(0x20)為空格,之前是控制字符,之后是有效字符。
  2. Unicode:使用兩字節對全球字符進行統一編碼,有65536個編碼,UCS-2為兩字節版本(2^16 =65536)。


    微信圖片_20181224194543.png
// 1.字符串
    var str = "Hello World!";
    var str1 = "你好,世界!12121";
    /* console.log(str.length);
     console.log(str1.length * 2 - 2);*/
    console.log(getStrLength(str1));
    console.log(getStrLength(str));
 /**
     * 獲取字符串的真實長度
     * @param {string}str
     * @returns {number}
     */
    function getStrLength(str) {
        // 1.定義變量
        var len = 0, code = 0;
        // 2. 遍歷
        for (var i = 0; i < str.length; i++) {
            // 2.1 Unicode碼
            code = str.charCodeAt(i);
            // console.log(code);
            // 2.2 判斷
            if (code >= 0 && code <= 127) {
                len += 1;
            } else {
                len += 2;
            }
        }
        // 3. 返回長度
        return len;
    }
3.根據字符返回位置。
indexOf

從前向后索引字符串位置(參數:索引字符串)
從前面尋找第一個符合元素的位置,找不到則返回-1。

lastIndexOf

從后向前索引字符串位置(參數:索引字符串)
從后面尋找第一個符合元素的位置,找不到則返回-1;

  • 索引值 = 數組.indexOf()/lastIndexOf()(數組中的元素);
4.uri編碼和解碼
  • encodeURIComponent() 函數可把字符串作為 URI 組件進行編碼。
  • decodeURIComponent() 函數可對 encodeURIComponent() 函數編碼的 URI 進行解碼。
    var str = "http://www.itmoma.com?name=yann";
    var str1 ="http://localhost:63342/%E4%B8%8A%E8%AF%BE%E4%BB%A3%E7%A0%81/05-JS%E7%89%B9%E6%95%88-%E4%B8%8B/05-uri%E7%BC%96%E7%A0%81%E5%92%8C%E8%A7%A3%E7%A0%81.html?_ijt=h8d2tjqjlprces058v6s86p9ji";
    // 1. 編碼
    var encodestr = encodeURIComponent(str);
    console.log(encodestr); // http%3A%2F%2Fwww.itmoma.com%3Fname%3Dyann
    // 2. 解碼
    var decodeStr = decodeURIComponent(str1);
    console.log(decodeStr);
    console.log(decodeURIComponent("https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=%E5%93%88%E5%93%88%E5%93%88&rsv_pq=bcd9c87700072f06&rsv_t=dc09UzZ2JpOa7o%2FDZ969ycvMaFxlARDd1LWKS%2FNnWeCCtroOis%2BJrD3%2B3qk&rqlang=cn&rsv_enter=0&rsv_sug3=5&rsv_sug1=4&rsv_sug7=100&inputT=3148&rsv_sug4=3473"));
5.截取字符串(重點)
concat()

連接字符串。連接兩個或更多的數組,并返回結果。

slice()

從某個已有的數組返回選定的元素。arrayObject.slice(start,end)

substr()

可在字符串中抽取從 start 下標開始的指定數目的字符。stringObject.substr(start,length)

substring()

提取字符串中介于兩個指定下標之間的字符。stringObject.substring(start,stop)

6.小數位數 toFixed()。把 Number 四舍五入為指定小數位數的數字。
    var PI = 3.1436592653;
    console.log(PI.toFixed(3));//3.144
    // 保留兩位小數    后面小數會四舍五入
7.轉換大小寫

toUpperCase,轉換為大寫(參數:無)
toLowerCase,轉換為小寫(參數:無)

    var str = "hello world!";
    var str1 = "HELLO WORLD!";
    console.log(str.toUpperCase());//HELLO WORLD!
    console.log(str1.toLowerCase());//hello world!
    • 作業

  • 1.將一個字符串數組輸出為|分割的形式,比如“劉備|張飛|關羽”,使用兩種方式實現
    var arr = ['劉備','張飛','關羽'];
    /*arr.splice(1,0,'|');
    arr.splice(3,0,'|');
    console.log(arr);
    console.log(arr.toString());*/
    var str = arr.toString();
    console.log(str.replace(/,/g, '|'));
    console.log(arr.join('|'));
  • 2.找到數組中每個字母出現的次數['c','a','z','a','a']
    //const countOccurences = (arr, value) => arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0);//箭頭函數
    function countOccurences(arr,value) {
        return arr.reduce(
            function (a,v) {
                return v === value ? a + 1 : a + 0;
            },0)
    }
    console.log('[1,3,4,6,1,3,5,6,3,1]中 1 出現的次數是:'+countOccurences([1,3,4,6,1,3,5,6,3,1],1));
  • 3.工資的數組[1500,1200,2000,2100,1800],把工資超過2000的刪除。
    var arr1 = [1500,1200,2000,2100,1800,500,2500];
    for(var i = 0;i < arr1.length;i++){
        if(arr1[i] > 2000){arr1.splice(i,1);}
    }
    console.log(arr1);

97.JS特效-上傳圖片格式驗證


  • onchange 事件會在域的內容改變時發生。
    <label>上傳圖片的格式驗證:</label>
    <input type="file" id="file">
-------------------------------------------------------------------------
    /*
      jpg png gif
    */
    window.onload = function () {
       // 1. 獲取標簽
        var file = document.getElementById('file');
       // 2. 監聽作用域的變化
        file.onchange = function () {
            // 2.1 獲取上傳圖片的路徑
            var path = this.value;
            // console.log(path);

            // 2.2 截取
            var suffix = path.substr(path.lastIndexOf('.'));
            // console.log(suffix);

            // 2.3 統一轉成小寫
            var lower_suffix = suffix.toLowerCase();
            // console.log(lower_suffix);

            // 2.4 判斷
            if(lower_suffix === '.jpg' || lower_suffix === '.png' || lower_suffix === '.jpeg' || lower_suffix === '.gif'){
                alert('上傳圖片正確');
            }else {
                alert('上傳圖片不正確');
            }
        }
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容