随笔,记录JavaScript中的面试题

我不知道我的js水平怎么样,但是今天有点受打击,看到很多题有坑。看了一些面试题,我记录下今天遇到的坑吧。

问题1:作用域

考虑以下代码,输出结果是什么?

(function() {

var a = b = 5;

})();

console.log(b);

答案是5。

这道题我知道,陷阱在于var a = b =5,如果是声明,应该是var a,b =5;这样a,b的值都为5,由于a,b的都在函数作用域里面,所以外部是输出不出来的,则会显示b = undefined。而这里,由于js的特性,所以这里相当于

var a,b = 5

这里的b = 5是个隐式变量!!!所以相当于window.b = 5,所以外部是可以访问到的。

问题2:创建“内置”方法

给String对象定义一个repeatify方法。该方法接收一个整数参数,作为字符串重复的次数,最后返回重复指定次数的字符串。例如:

console.log(‘hello‘.repeatify(3));

输出应该是:

hellohellohello.

看到这道题,我就在想,这道题的目的在于解决hello这个字符串,然后要复制3个这个字符串,那么这个特别向我刚看到的一个函数,一会再贴。

   String.prototype.repeatify = String.prototype.repeatify || function ( times ) {
                var str = ‘‘;
                for ( var i = 0 ; i < times ; i++ ) {
                    str += this;
                }
                return str;
            };
            console.log ( ‘hello‘.repeatify(3) );

这里应该考察的是对proptotype,也就是原型的理解。解释下,加深影响!!String.prototype.repeatify相当于给String的原型添加一个自定义的repeatify方法,function(time)这个函数则是方法,

首先定义个str,也就是一个空字符串,用来接受传参。repeatify(3)就是要复制3份输出,那么就遍历下吧,有几次,就加几份,这里传入参数3次,那么for循环3次,让str加上this,这里的this就是指代的自身,就是str。等于str=str+str+str,最后return,将str作为值输出,记得今天看到一句话,函数就是找值!!!!!这句话很重要,就是要用值做别的事情!!

还有个关键点,就是||判断!!!如果有该方法,那就跳过,使用原方法。

问题3 :声明提前

下面这段代码的结果是什么?为什么?

function test () {
       console.log( a );  //undefined
       console.log( foo() );  // 2
       var a = 1;
       function foo() {
           return 2;
       }
   }
   test();

答案我已经敲出来啦!原来我也不差,这里我需要解释一下,为什么第一个a是undefined呢?很简单啦,这里是声明提升,相当于var a提前到console.log( a );上面去啦,这里a其实并没有赋值,所以就是undefined了;那么为啥函数就可以返回2呢?!因为console.log( foo() );是函数调用,所以在函数体呢,写哪里都是可以的。

问题4:JavaScript中的this

下面代码的运行结果是什么并做解释。

var fullname = ‘John Doe‘;

    var obj = {

        fullname: ‘Colin Ihrig‘,

        prop: {

            fullname: ‘Aurelio De Rosa‘,

            getFullname: function() {

                return this.fullname;

            }}};

    console.log( obj.prop.getFullname() );  // Aurelio De Rosa

    var test = obj.prop.getFullname;

    console.log( test() );  // John Doe

答案我也写出来,也比较简单,主要是对this的考察,听说面试的时候是必考this的!所以,我还要看更多的例子呀。

记住一个关键点就是:Javascript中关键字this所指代的函数上下文,取决于函数是怎样被调用的,而不是怎样被定义的。

所以就简单啦,第一个this调用的是prop里的fullname,而第二个test是定义在全局(window)中的,所以就是在全局的调用啦,那么就调用在全局定义的fullname咯。还是不难的哈,希望我以后有个徒弟,能看到这些笔记,也是我的一个成长记录,我要成为伟大的工程师,而不是一个半吊子或者只知道写代码的码农!我要理解其中的原理,这才是我活着的意义,扯远了。。下一个!

问题5:call()和apply()

修复前一个问题,让最后一个console.log() 打印输出Aurelio De Rosa.

考察call和apply。。。我有点无力,因为这个我还真的搞不明白啊,我需要好好看看啦。

这个问题可以通过运用call()或者apply()方法强制转换上下文环境。

console.log(test.call(obj.prop));

这里。。我就捂脸看书去吧。。

还有个问题!!今天碰到了!!哎呀妈呀,我做错啦,思考了好久,终于在网上求助找到了答案

var a = {n:1};
var b = a;
a.x = a = {n:2};
alert(a.x);// --> undefined
alert(b.x);// --> Object {n:2}

为啥这里的a.x是undefined呢?我是想了很久没想明白。。。现在明白了,a.x = a = {n:2};由于.运算符优先于=,所以其实这行代码解析为:

1、a.x(在a中创建一个x对象,值为null),同时由于 b = a,所以b中也有一个x为null

2、a = {n:2};这啥意思呢?就是说由于a对象中有n,所以直接修改它的值(哎呀,这让我想到了,创建的字符串、数组是不可修改的!!而对象。。想改就改,没人权啊!)

3、由于b中有x了,那么就把{n:2}添加到b中。

赋值结果就是:

a => {n: 2,x: undefined }
b => {n: 1, x: {n: 2 } }  

还有有点绕的啊!不过呢,我还是搞清楚了!啦啦啦~

查完回来——.(点)、()(小括号)、[](中括号)这三个在js中是运算级最高的!

时间: 2024-08-06 03:15:35

随笔,记录JavaScript中的面试题的相关文章

[记录] JavaScript 中的函数

函数: 函数是一段可以反复调用的代码块.可以传递参数,不同的参数会返回不同的值. 函数声明的三种方法: 1. function 命令 function 命令声明的代码块,就是一个函数. function 命令后面是函数名,函数名后面是一对圆括号(), 里面可以传入参数.函数体放在大括号里面. function show(name) { // 代码块... console.log( name ); } 2. 函数表达式 除了用 function 命令声明函数, 还可以采用变量赋值的写法. var

[记录] JavaScript 中的深浅拷贝(克隆)

浅拷贝和深拷贝针对的是Object.Array这样复杂的引用类型数据 简单说:浅拷贝只复制一层的属性,而深拷贝则递归复制所有层级的属性 一.浅拷贝 1 function clone(origin, target) { 2 var result = target || {}; 3 for ( var prop in origin ){ 4 target[prop] = origin[prop]; 5 } 6 return result; 7 } 如果对象的属性值是数组或对象,实际上,存储的值是一个

[记录] JavaScript 中的字符串操作

JS 中的字符串操作 字符串:基本数据类型,一旦定义就不会被修改,如果修改则是重新开辟空间存储.字符串有属性length和一系列方法. 字符串的生成转换 (可以将任何类型的数据转换为字符串) 转换成字符串的三种方式: 1. .toString() 方法 注: undefined.null没有toString()方法. code: var num = 28; console.log(typeof num.toString()); // 返回结果是"string", 2. String()

[记录] JavaScript 中的数组操作

1. 定义方式:    var arr = []; // 数组字面量    var arr = new Array(); // 数组构造函数 数组所有方法都来源于 Array.prototype 2. 数组的读和写:    arr[num]  // 不可以溢出读  结果undefined    arr[num] = xxx; // 可以溢出写 3. 改变原数组    push()    // 在数组最后一位添加数据,返回值是数组的长度:    模拟数组方法:    Array.prototype

javascript中字符串格式转化成json对象记录

什么是JSON JSON(JavaScript Object Notation)是一种优美的JavaScript对象创建方法.JSON也是一种轻量级数据交换格式.JSON非常易于人阅读与编写,同时利于机器解析与生成.JSON是在AJAX中代替XML交换数据的更佳方案. JSON格式与语法 var jsonobject= {         //对象内的属性语法(属性名与属性值是成对出现的)         propertyname:value, //对象内的函数语法(函数名与函数内容是成对出现的

Javascript中常见的10大面试题及答案

在IT界中,JavaScript开发人员的需求量一直居高不下.如果你的能力能够胜任这一角色,那么你有很多机会换一家公司,并提高薪水.但在你被一家公司聘用之前,你必须展示你的技能,以通过面试环节.在本文中,我将向您展示10个 JavaScript 技能典型问题以及其相关解决方案,来面试前端工程师.它们很有意思! 问题1: 作用域(Scope) 考虑以下代码: (function() { var a = b = 5; })(); console.log(b); 控制台(console)会打印出什么?

通过一道笔试题浅谈javascript中的promise对象

因为前几天做了一个promise对象捕获错误的面试题目,所以这几天又重温了一下promise对象.现在借这道题来分享下一些很基础的知识点. 下面是一个面试题目,三个promise对象捕获错误的例子,返回结果有什么不同. //使用throw添加错误事件 var p = new Promise(function(resolve, reject) { resolve("ok"); throw new Error('error0'); //setTimeout(function() { thr

关于JavaScript中的事件代理

今天面试某家公司Web前端开发岗位,前面的问题回答的都还算凑活,并且又问了一下昨天面试时做的一道数组去重问题的解题思路(关于数组去重问题,可以观赏我前几天写的:http://www.cnblogs.com/craftsman-gao/p/4766223.html.幸好前几天专门看过这个问题,答题时才能轻松应对啊),因为这些以前都有过研究,所以回答起来并没有太大困难.然而,最后面试官又出了一道代码题让我涨姿势了.题目本身很简单:一个ul中有一千个li,如何给这一千个li绑定一个鼠标点击事件,当鼠标

转---深入浅出妙用 Javascript 中 apply、call、bind

作者:伯乐在线专栏作者 - chokcoco 如有好文章投稿,请点击 → 这里了解详情 如需转载,发送「转载」二字查看说明 这篇文章实在是很难下笔,因为网上相关文章不胜枚举. 巧合的是前些天看到阮老师的一篇文章的一句话: "对我来说,博客首先是一种知识管理工具,其次才是传播工具.我的技术文章,主要用来整理我还不懂的知识.我只写那些我还没有完全掌握的东西,那些我精通的东西,往往没有动力写.炫耀从来不是我的动机,好奇才是." 对于这句话,不能赞同更多,也让我下决心好好写这篇,网上文章虽多,