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

趣味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); //10000
console.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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值