js-基本数据类型-你不知道的趣味题

来源:互联网 发布:淘宝大学讲师 编辑:程序博客网 时间:2024/06/05 21:09

趣味1:原生js实现字符串转为数组,反转数组

/*写个js函数func(str),传参str为一个字符串,实现把这个字符串语句中的单词(空格隔开的)次序逆序。比如把 I am a coder变成 coder a am I,不允许使用reverse,join,substr,split*/    var str = "I am a coder";    console.log(getStr(str));    /*字符串语句中的单词(空格隔开的)次序逆序*/    function getStr(str) {        var res = "",            temp = "";        for (var i = str.length - 1; i >= 0; i--) {            if (str[i] == " " || i == 0) {                temp += (i == 0 ? str[i] : "");                res += (i == 0 ? reverseStr(temp) : reverseStr(temp) + " "); //处理末尾没有空格                temp = "";                continue;            }            temp += str[i];        }        return res;    }    /*反转字符串*/    function reverseStr(str) {        var newStr = "";        for (var i = str.length - 1; i >= 0; i--) {            newStr += str[i];        }        return newStr;    }

趣味2:对象添加属性,属性是对象,该咋办?

var c={};var a={a:"a"};var b={b:"b"};c[a]=123;c[b]=345;console.log(c[a]);

c是对象,添加属性时,都会转为字符串。
这里添加a属性,a是对象,调用toString()方法,转化为字符串“[object,Object]”,所以c就把“[object,Object]”当做属性加进去了,值为123。c[b]同样的道理,但345会覆盖123,所以结果为345

趣味3.如果 对于function的参数arguments 想当做数组来使用数组的内置函数 要怎么做?

Array.prototype.***.call
function test(name,age){    console.log(Array.prototype.join.call(arguments,",")); //xiaowei,18    var arr = ["1","2"];    console.log(arr.concat("3").join(",")); //1,2,3         console.log(Array.prototype.concat.call(arguments,"come").join(",")); //[object Arguments],come    console.log([].slice.call(arguments).concat("come").join(',')); //xiaowei,18,come    console.log(Array.prototype.concat.apply(["come"],arguments)); //come,xiaowei,18}    test("xiaowei",18);    var name = "lala";备注:arguments转为数组的方法:[].slice.call(arguments);或者 Array.prototype.slice.call(arguments); function fn(a, b, c) {            /*方法一:var arr = [].slice.call(arguments);*/            /*方法二:var arr = [].concat.apply([],arguments);*/            /*方法三*/            var arr = [];            arr.push.apply(arr,arguments);            console.log(arr instanceof Array);            console.log(arr);        }        fn(1,2,3);

趣味4: js 里面数组下标可以是负值问题

var arr = [];arr[0] = 0;arr[1] = 1;arr[-1] = -1;arr[1.1] = 1.1;arr['a'] = 'a';console.log("length: " + arr.length);console.log(arr);for(var i in arr){    console.log(i + " :" + arr[i]);}

这里写图片描述

数组对象其实是一个特殊对象,他拥有普通对象的全部特性,所以不止负索引,小数索引,连字符串索引都是可以的,只是用这些索引向数组添加属性时,数组的length不会增加罢了,而只有当索引是正整数或其对应数字串时,length才会增加,仅此而已。

例题:

var arr = [];  arr['a'] = 1;  console.log(arr.length); // A  arr['2'] = 2;  console.log(arr.length); // B  arr.length = 0;  console.log(arr); // C  
结果为: 0 3 [a:1]

趣味5: js 里面数组设置length为10000,会不会开辟内存?

数组是特殊的对象,可以理解为属性值是数值的对象,当我们直接将一个空数组的length设为10000,并不会多开辟内存空间。

var a=[2,3,4];a.length=10000;console.log(a.length); //10000console.log(a[900]); //undefined,并没有开辟更多的内存空间,js中是用到才开辟

6、函数表达式–匿名函数

var f = function g() {    return 23;};typeof g(); //输出什么// ReferenceError: g is not defined

7、Array.prototype.indexOf() ,switch…case 使用全等模式比较

function showCase(value) {    switch (value) {    case 'A':        console.log(1);        break;    case 'string':        console.log(2);        break;    case undefined:        console.log(3);        break;    case 'undefined':        console.log(4);        break;     default:        console.log(5);        break;                  }}showCase(new String('A'));//结果:5
0 0
原创粉丝点击