年会搞笑小品剧本;如此私募
人物:潘老板(潘律师饰演),高兴养猪有限公司老板;红大牛律师(红大牛饰演),雷倒兄弟律师事务所十年级 律师;前台、助理小吴:吴律师饰演。场景:雷倒兄弟律师事务所会议室道具:一桌三椅一“大家好!俺是高兴养猪公司的老板,有个老外要给俺养猪公司投钱,俺想找个律师打听打听,听说北京律师好,俺娘啊,这北京刚大了,找半天找不着!”掏出90年代大哥大,拨号,自言自语:“洞拐洞拐洞洞拐(),俺娘,这号钢好了,整的跟似的,喂,是雷倒兄弟律师事务所吗?”小吴:(特严肃,很正规)“这里是语音提示,你好,欢迎致电雷倒兄弟律师事务所,我们的口号是“我参与、你奉献、我才快乐”,欲了解本所历史沿革请按一…”潘老板:“那俺先严格滴了解一下历史,一”小吴:“本所成立于年,是 批经大清国总理衙门认可的外资所,本所的起点较高, 单业务就是受当时世界上 的私募基金八国联*的委托,与清*府就私募基金的退出事宜进行谈判,唉呀,那时的八国集团,好红火呦!火的都烧起来了!”潘老板:“俺娘啊,狗头*事那,我不听!”小吴:“欲了解本所的业务范围,请俺二”潘老板:“二!”小吴:“本所主要从事证券市场融资、资产重组及IPO业务,另外还兼营刻章办证,坏啦,哎呀说漏了,这段掐去别播!欲了解本所的分支机构,请按三”潘老板(学范伟语调):“三那!”小吴:“本所自设立以来,在巴黎、伦敦、加拿大、老挝、不丹、巴勒斯坦、埃及、南极、北极、索马里均设有分支机构,与当地*府括号流亡*府括号完了及反*府武装均建立了密切的联系!”潘老板:“俺娘啊,还是雇佣*那,这所好好有背景呦,好好有实力呦,我喜欢,耶!我的选择,没错滴,耶!”(面向观众双手伸V字,做开心状)小吴:“如需话务员人工服务请直接拨分机!”潘老板:“警察律师联机了,,喂,是连兄弟都雷倒的律师所不,你们所在哪儿啊?”小吴:“啥子呦,没得水平,这里是LeiDaoBrotherslaw0ffices,地址是坑死你大街甲号。”潘老板:(推门而入)“俺娘哎,终于找到了,是连兄弟都雷倒的律师所不?”小吴:(嗲声嗲气)“正是,老板你好,本所竭诚为您提供全方位服务!”回头对里屋大喊:“牛律师,有客户!”红大牛:(西装革履慢慢踱进会议室)“Hello!Letmeintroducemyself,我是雷倒兄弟律师事务所十年级 律师红大牛,红就是“一颗红心,两手准备”的红,牛是牛年的牛,大是大牛年的大!”户口在澳大利亚,目前暂居贵国,还没有办暂住证,mayIhelpyou?”(两人热烈握手,继尔拥抱)潘老板:“helpme!兄弟啊,同志啊,俺也自我介绍一下,俺刚来北京,也没办暂住证呢,俺叫潘老板,俺也有英文名,人家都叫我格力斯潘,俺开了一个公司,叫高兴养猪有限责任公司。”红大牛:“stop!stop!我说格林斯潘那,怪不得大家要清算你呢,你老糊涂了吧,我不会养猪诶,我没见过猪跑,只吃过猪肉,要是猪生病,出门左拐再右拐走医院!”潘老板:“有人说千不怕万不怕,就怕老外说中国话,你说的还不赖!”红大牛:“小样,比你说的好,有啥事找我啊?”潘老板:“牛律师,你先抽根烟”。红大牛:“不抽不抽!”潘老板:“抽根吧,好烟,九五 的,一千五百块钱一条呢”。红大牛:“不抽不抽,(手指墙上)nosmoking!”潘老板:“司啥king?”红大牛:“就是不准吸烟!”潘老板:“哦,那就不抽了,俺省大发了!”潘老板:“俺这次来北京是要咨询!我知道你是律师,不是兽医,有一个老外要投资俺的养猪公司,我听俺们村律师说这个叫、叫、叫啥私、私、私奔?”红大牛:“那叫私募!啊,要私募啊,哦也也(对着观众坏笑,做兴奋状),快请坐!小吴,上茶!”潘老板:对小吴说:“谢谢啊(学范伟强调)”,“对对,私募!没有私奔说着顺,这私、私奔、不不、私募,怎么个私法?”红大牛:“私募就是老外投资你的养猪公司,然后上市!”潘老板:“俺的猪已经上市了!不上市场俺怎么卖猪肉啊?”小吴:“哎呀我说猪总,不不潘总,养猪你在行,上市我们在行,我们说的上市不是上市场卖猪肉,是让您的养猪公司变成上市公司,比如中石油、中石化,知道了吧?您的公司上市后就叫中石猪,名字好响亮呦!”红大牛:“潘总,上市是个严肃的话题,在回答你的咨询之前,我得让我的秘书向您宣布几条声明,小吴,开始!”小吴:“咳咳, 、本次咨询不构成任何法律意见;第二、未经本所同意,不得向任何第三方泄露本次咨询的内容;第三、潘总所做叙述均为真实、准确、完整的,听清楚了吗?”潘老板:“俺是老实人、俺从来都是说实话、办老实事!”小吴:“那开始计时了,猪~~~潘总请坐请坐。”潘老板:“俺不习惯坐,跟猪呆惯了,你们坐你们坐。”(吴和牛坐下,潘站着)红大牛:“首先,请您回答我几个问题, 、你和那个外国人到底是什么关系?请回答!”潘老板:“啊,什么关系?我和他没关系啊,俺没里通外国,我很爱国!”红大牛:“有什么证据证明你爱国?”潘老板:“俺的猪肉都出口给你们老外,猪心都留在国内啦,我卖的猪都爱国,别说我啦!”红大牛:“有道理,这么说,你和那个投资的老外既不是父子关系,也不是兄弟姐妹之类的关系啦?”潘老板:“这、这不是废话吗,俺家亲戚都没出过县城!别说出国了,唱:洋装虽然穿在身,我心依然是中国心…”红大牛:“stop!stop!soundsterrible!(红大牛站起来了,做暂停的手势)第二个问题,请问,他要买你的猪还是买你公司的股权?请回答”潘老板(大声地):“猪啊!”红大牛:(ummm,沉思片刻,手托下巴,来回走,突然转身,大声说)“据我分析,本案是一个典型的非实际控制人的外资并购,需要向省级商务部门、外管局、工商局、城管、畜牧局办理一系列特别复杂的手续。”潘老板:“这么复杂啊,俺们县工商所办不了吗?”小吴(拿着一沓纸):“十号令,看看十号令,这是规定!”红大牛:(转身对观众坏笑)“嘿嘿,本来不复杂,一找我们就复杂!”潘老板:“你说啥?”红大牛:“不不不,我是说不复杂要律师干嘛,找我们就找对了!”潘老板:“哦,俺听错了!还有啥问题没?”红大牛:“请问你养的这些猪都吃啥?”潘老板:“饲料呗!”红大牛:“不行,虐待动物,长期吃饲料会造成营养不良,精神忧郁,导致资产质量下降,影响PE!”潘老板:“那怎么办?改吃大鱼大肉加饭后水果行不?”红大牛:“ !现在华尔街的人都饿肚子,你还给猪吃大鱼大肉,我鄙视你!”潘老板:“那咋办?这也不行那也不行,要不这样行不,每头猪每天发块钱伙食费,想吃点啥买点啥!”红大牛:“高!不亏是专家,哈哈,下面我介绍一下我们的工作流程,首先要DD!”潘老板:“啥弟弟,谁的弟弟,俺没有弟弟啊”小吴:“俺的猪总啊,不不,潘总,DD是DueDiligence,就是尽职调查的意思!”红大牛:“首先我们向贵公司提交DD清单,包括法律、业务,共十八大项。”小吴:“其次我们要组织由十名律师组成的团队进驻养猪场,对贵公司进行尽职调查。”红大牛:“然后我们会对每只猪进行调查访谈!”潘老板:“不用调查,俺的猪可好了, 绿色, 无抗,不含 氰胺,苏丹红,富含钙铁锌硒等各种微量元素,吃一块顶五块,上六楼不喘气,今天您吃了没有?”小吴:“吃了吃了!为了让更多的人吃上猪肉,我们要给猪制作电子数据库,并向投资者开放,也就是说,每只猪都上网!”大牛:“尽职调查完成后,我们会出具相关备忘录”潘老板:哎呀俺娘,太专业了,你比我还了解猪!小吴:“老外看了数据库,肯定满意,接下来就会签合同来投资,你发大财喽!”大牛和小吴合唱:“猪!你上市成功,猪!你上市成功!”潘老板唱:“onlyyou,能帮我做上市,onlyyou,能帮我去圈钱!”小品剧本(用坚定的语气)这事就交给你们办了,得几百块钱啊?”红大牛:“别跟我提钱,俗!忒俗!我最烦钱!”潘老板:“那不行啊,大过年的,你说个数!我不还价!”红大牛:“不多不多,也就..…”潘老板:“那行,就这么定了!”(做掏钱状)红大牛:“万…美元!”潘老板:(眼睛瞪老大,做抓狂状,咣当做到凳子上,要摔倒)“啊,万美元!这么多啊,把我所有的猪卖了也不值这个钱啊,你要俺的命呀,俺不干了”红大牛:“嘿嘿,不做也行,要不您把刚才的咨询费用付了?”潘老板:“咨询费?还有咨询费呀!长见识了,多少钱?”红大牛:“小吴,给算算!”小吴:“您刚才电话咨询,每分钟美元,共通话1小时03分,按照2小时计费,共美元,当面咨询1小时05分,按照2小时计费,共美元,茶水费空调费座位费服务费就免了,请付美元,谢谢!”潘老板:“俺娘啊,,还是美元,太贵了!”红大牛:“切!这还贵!这还不是P的价格?”潘老板:“啥P啊?P的价格更贵?”小吴:“P就是partner,就是合伙人,比牛律师更贵!”潘老板:(做痛苦状)俺娘啊!拿猪肉顶钱行不?俺干的这是啥P事啊!(三人谢幕)观众鼓掌后,小吴和大牛下场,老潘对观众说:“俺听说北京还有个镀金律师事务所,那个便宜!俺去看看!镀镀金!”(下场)
以下是前端每日一题的解答汇总,以倒序排列。当天以及往期的解答会更新在这里。
#64期
输出什么?constvalue={number:10};constmultiply=(x={...value})={console.log(x.number*=2);};multiply();multiply();multiply(value);multiply(value);A:20,40,80,B:20,40,20,40C:20,20,20,40D:NaN,NaN,20,40答案:C
在ES6中,我们可以使用默认值初始化参数。如果没有给函数传参,或者传的参值为"undefined",那么参数的值将是默认值。上述例子中,我们将value对象进行了解构并传到一个新对象中,因此x的默认值为{number:10}。
默认参数在调用时才会进行计算,每次调用函数时,都会创建一个新的对象。我们前两次调用multiply函数且不传递值,那么每一次x的默认值都为{number:10},因此打印出该数字的乘积值为20。
第三次调用multiply时,我们传递了一个参数,即对象value。*=运算符实际上是x.number=x.number*2的简写,我们修改了x.number的值,并打印出值20。
第四次,我们再次传递value对象。x.number之前被修改为20,所以x.number*=2打印为40。
#63期
输出是什么?letnum=10;constincreaseNumber=()=num++;constincreasePassedNumber=number=number++;constnum1=increaseNumber();constnum2=increasePassedNumber(num1);console.log(num1);console.log(num2);A:10,10B:10,11C:11,11D:11,12答案:A
一元操作符++先返回操作值,再累加操作值。num1的值是10,因为increaseNumber函数首先返回num的值,也就是10,随后再进行num的累加。
num2是10因为我们将num1传入increasePassedNumber.number等于10(num1的值。同样道理,++先返回操作值,再累加操作值。)number是10,所以num2也是10.
#62期
输出是什么?constsettings={username:"lydiahallie",level:19,health:90};constdata=JSON.stringify(settings,["level","health"]);console.log(data);A:"{"level":19,"health":90}"B:"{"username":"lydiahallie"}"C:"["level","health"]"D:"{"username":"lydiahallie","level":19,"health":90}"答案:A
JSON.stringify的第二个参数是替代者(replacer).替代者(replacer)可以是个函数或数组,用以控制哪些值如何被转换为字符串。
如果替代者(replacer)是个数组,那么就只有包含在数组中的属性将会被转化为字符串。在本例中,只有名为"level"和"health"的属性被包括进来,"username"则被排除在外。data就等于"{"level":19,"health":90}".
而如果替代者(replacer)是个函数,这个函数将被对象的每个属性都调用一遍。函数返回的值会成为这个属性的值,最终体现在转化后的JSON字符串中(译者注:Chrome下,经过实验,如果所有属性均返回同一个值的时候有异常,会直接将返回值作为结果输出而不会输出JSON字符串),而如果返回值为undefined,则该属性会被排除在外。
#61期
输出是什么?constperson={name:"Lydia"};Object.defineProperty(person,"age",{value:21});console.log(person);console.log(Object.keys(person));A:{name:"Lydia",age:21},["name","age"]B:{name:"Lydia",age:21},["name"]C:{name:"Lydia"},["name","age"]D:{name:"Lydia"},["age"]答案:B
通过defineProperty方法,我们可以给对象添加一个新属性,或者修改已经存在的属性。而我们使用defineProperty方法给对象添加了一个属性之后,属性默认为不可枚举(notenumerable).Object.keys方法仅返回对象中可枚举(enumerable)的属性,因此只剩下了"name".
用defineProperty方法添加的属性默认不可变。你可以通过writable,configurable和enumerable属性来改变这一行为。这样的话,相比于自己添加的属性,defineProperty方法添加的属性有了更多的控制权。
#60期
输出是什么?constuser={name:"Lydia",age:21};constadmin={admin:true,...user};console.log(admin);A:{admin:true,user:{name:"Lydia",age:21}}B:{admin:true,name:"Lydia",age:21}C:{admin:true,user:["Lydia",21]}D:{admin:true}答案:B
扩展运算符...为对象的组合提供了可能。你可以复制对象中的键值对,然后把它们加到另一个对象里去。在本例中,我们复制了user对象键值对,然后把它们加入到admin对象中。admin对象就拥有了这些键值对,所以结果为{admin:true,name:"Lydia",age:21}.
#59期
输出是什么?constnumbers=[1,2,3,4,5];const[y]=numbers;console.log(y);A:[[1,2,3,4,5]]B:[1,2,3,4,5]C:1D:[1]答案:C
我们可以通过解构赋值来解析来自对象的数组或属性的值,比如说:
[a,b]=[1,2];
a的值现在是1,b的值现在是2.而在题目中,我们是这么做的:
[y]=[1,2,3,4,5];
也就是说,y等于数组的 个值就是数字1.我们输出y,返回1.
#58期
输出是什么?constname="Lydia";age=21;console.log(deletename);console.log(deleteage);A:false,trueB:"Lydia",21C:true,trueD:undefined,undefined答案:A
delete操作符返回一个布尔值:true指删除成功,否则返回false.但是通过var,const或let关键字声明的变量无法用delete操作符来删除。
name变量由const关键字声明,所以删除不成功:返回false.而我们设定age等于21时,我们实际上添加了一个名为age的属性给全局对象。对象中的属性是可以删除的,全局对象也是如此,所以deleteage返回true.
#57期
输出是什么?//counter.jsletcounter=10;exportdefaultcounter;
//index.jsimportmyCounterfrom"./counter";myCounter+=1;console.log(myCounter);A:10B:11C:ErrorD:NaN答案:C
引入的模块是只读的:你不能修改引入的模块。只有导出他们的模块才能修改其值。
当我们给myCounter增加一个值的时候会抛出一个异常:myCounter是只读的,不能被修改。
#56期
输出是什么?constset=newSet([1,1,2,3,4]);console.log(set);A:[1,1,2,3,4]B:[1,2,3,4]C:{1,1,2,3,4}D:{1,2,3,4}答案:D
Set对象是 的值的集合:也就是说同一个值在其中仅出现一次。
我们传入了数组[1,1,2,3,4],他有一个重复值1.以为一个集合里不能有两个重复的值,其中一个就被移除了。所以结果是{1,2,3,4}.
#55期
输出是什么?classDog{constructor(name){this.name=name;}}Dog.prototype.bark=function(){console.log(`WoofIam{this.name}`);};constpet=newDog("Mara");pet.bark();deleteDog.prototype.bark;pet.bark();A:"WoofIamMara",TypeErrorB:"WoofIamMara","WoofIamMara"C:"WoofIamMara",undefinedD:TypeError,TypeError答案:A
我们可以用delete关键字删除对象的属性,对原型也是适用的。删除了原型的属性后,该属性在原型链上就不可用了。在本例中,函数bark在执行了deleteDog.prototype.bark后不可用,然而后面的代码还在调用它。
当我们尝试调用一个不存在的函数时TypeError异常会被抛出。在本例中就是TypeError:pet.barkisnotafunction,因为pet.bark是undefined.
#54期
输出是什么?(()={letx=(y=10);})();console.log(typeofx);console.log(typeofy);A:"undefined","number"B:"number","number"C:"object","number"D:"number","undefined"答案:A
letx=y=10;是下面这个表达式的缩写:
y=10;letx=y;
我们设定y等于10时,我们实际上增加了一个属性y给全局对象(浏览器里的window,Nodejs里的global)。在浏览器中,window.y等于10.
然后我们声明了变量x等于y,也是10.但变量是使用let声明的,它只作用于块级作用域,仅在声明它的块中有效;就是案例中的立即调用表达式(IIFE)。使用typeof操作符时,操作值x没有被定义:因为我们在x声明块的外部,无法调用它。这就意味着x未定义。未分配或是未声明的变量类型为"undefined".console.log(typeofx)返回"undefined".
而我们创建了全局变量y,并且设定y等于10.这个值在我们的代码各处都访问的到。y已经被定义了,而且有一个"number"类型的值。console.log(typeofy)返回"number".
#53期
输出是什么?functionCar(){this.make="Lamborghini";return{make:"Maserati"};}constmyCar=newCar();console.log(myCar.make);A:"Lamborghini"B:"Maserati"C:ReferenceErrorD:TypeError答案:B
返回属性的时候,属性的值等于返回的值,而不是构造函数中设定的值。我们返回了字符串"Maserati",所以myCar.make等于"Maserati".
#52期
输出是什么?functiongreeting(){throw"Helloworld!";}functionsayHi(){try{constdata=greeting();console.log("Itworked!",data);}catch(e){console.log("Ohnoanerror:",e);}}sayHi();A:"Itworked!Helloworld!"B:"Ohnoanerror:undefinedC:SyntaxError:canonlythrowErrorobjectsD:"Ohnoanerror:Helloworld!答案:D
通过throw语句,我么可以创建自定义错误。而通过它,我们可以抛出异常。异常可以是一个字符串,一个数字,一个布尔类型或者是一个对象。在本例中,我们的异常是字符串Helloworld.
通过catch语句,我们可以设定当try语句块中抛出异常后应该做什么处理。在本例中抛出的异常是字符串Helloworld.e就是这个字符串,因此被输出。最终结果就是Ohanerror:Helloworld.
#51期
输出的是什么?functiongetInfo(member,year){member.name="Lydia";year="";}constperson={name:"Sarah"};constbirthYear="";getInfo(person,birthYear);console.log(person,birthYear);A:{name:"Lydia"},""B:{name:"Sarah"},""C:{name:"Lydia"},""D:{name:"Sarah"},""答案:A
普通参数都是值传递的,而对象则不同,是引用传递。所以说,birthYear是值传递,因为他是个字符串而不是对象。当我们对参数进行值传递时,会创建一份该值的复制。(可以参考问题46)
变量birthYear有一个对""的引用,而传入的参数也有一个对""的引用,但二者的引用并不相同。当我们通过给year赋值""来更新year的值的时候我们只是更新了year(的引用)。此时birthYear仍然是"".
而person是个对象。参数member引用与之相同的对象。当我们修改member所引用对象的属性时,person的相应属性也被修改了,因为他们引用了相同的对象.person的name属性也变成了"Lydia".
#50期
输出是什么?[1,2,3].map(num={if(typeofnum==="number")return;returnnum*2;});A:[]B:[null,null,null]C:[undefined,undefined,undefined]D:[3xempty]答案:C
对数组进行映射的时候,num就是当前循环到的元素.在这个例子中,所有的映射都是number类型,所以if中的判断typeofnum==="number"结果都是true.map函数创建了新数组并且将函数的返回值插入数组。
但是,没有任何值返回。当函数没有返回任何值时,即默认返回undefined.对数组中的每一个元素来说,函数块都得到了这个返回值,所以结果中每一个元素都是undefined.
#49期
num的值是什么?constnum=parseInt("7*6",10);A:42B:"42"C:7D:NaN答案:C
只返回了字符串中 个字母.设定了进制后(也就是第二个参数,指定需要解析的数字是什么进制:十进制、十六机制、八进制、二进制等等……),parseInt检查字符串中的字符是否合法.一旦遇到一个在指定进制中不合法的字符后,立即停止解析并且忽略后面所有的字符。
*就是不合法的数字字符。所以只解析到"7",并将其解析为十进制的7.num的值即为7.
#48期
输出是什么?console.log(3+4+"5");A:""B:"75"C:12D:"12"答案:B
当所有运算符的优先级相同时,计算表达式需要确定运算符的结合顺序,即从右到左还是从左往右。在这个例子中,我们只有一类运算符+,对于加法来说,结合顺序就是从左到右。
3+4首先计算,得到数字7.
由于类型的强制转换,7+5的结果是"75".JavaScript将7转换成了字符串,可以参考问题15.我们可以用+号把两个字符串连接起来。"7"+"5"就得到了"75".
#47期
输出是什么?constperson={name:"Lydia",age:21};for(constiteminperson){console.log(item);}A:{name:"Lydia"},{age:21}B:"name","age"C:"Lydia",21D:["name","Lydia"],["age",21]答案:B
在for-in循环中,我们可以通过对象的key来进行迭代,也就是这里的name和age。在底层,对象的key都是字符串(如果他们不是Symbol的话)。在每次循环中,我们将item设定为当前遍历到的key.所以一开始,item是name,之后item输出的则是age。
#46期
输出是什么?letperson={name:"Lydia"};constmembers=[person];person=null;console.log(members);A:nullB:[null]C:[{}]D:[{name:"Lydia"}]答案:D
首先我们声明了一个拥有name属性的对象person。
然后我们又声明了一个变量members.将 元素赋值为变量person。当设置两个对象彼此相等时,它们会通过引用进行交互。但是当你将引用从一个变量分配至另一个变量时,其实只是执行了一个复制操作。(注意一点,他们的引用并不相同!)
接下来我们让person等于null。
我们没有修改数组 个元素的值,而只是修改了变量person的值,因为元素(复制而来)的引用与person不同。members的 个元素仍然保持着对原始对象的引用。当我们输出members数组时, 个元素会将引用的对象打印出来。
#45期
返回值是什么?constfirstPromise=newPromise((res,rej)={setTimeout(res,,"one");});constsecondPromise=newPromise((res,rej)={setTimeout(res,,"two");});Promise.race([firstPromise,secondPromise]).then(res=console.log(res));A:"one"B:"two"C:"two""one"D:"one""two"答案:B
当我们向Promise.race方法中传入多个Promise时,会进行优先解析。在这个例子中,我们用setTimeout给firstPromise和secondPromise分别设定了ms和ms的定时器。这意味着secondPromise会首先解析出字符串two。那么此时res参数即为two,是为输出结果。
#44期
输出是什么?function*generator(i){yieldi;yieldi*2;}constgen=generator(10);console.log(gen.next().value);console.log(gen.next().value);A:[0,10],[10,20]B:20,20C:10,20D:0,10and10,20答案:C
一般的函数在执行之后是不能中途停下的。但是,生成器函数却可以中途“停下”,之后可以再从停下的地方继续。当生成器遇到yield关键字的时候,会生成yield后面的值。注意,生成器在这种情况下不返回(return)值,而是生成(yield)值。
首先,我们用10作为参数i来初始化生成器函数。然后使用next()方法一步步执行生成器。 次执行生成器的时候,i的值为10,遇到 个yield关键字,它要生成i的值。此时,生成器“暂停”,生成了10。
然后,我们再执行next()方法。生成器会从刚才暂停的地方继续,这个时候i还是10。于是我们走到了第二个yield关键字处,这时候需要生成的值是i*2,i为10,那么此时生成的值便是20。所以这道题的最终结果是10,20。
#43期
输出是什么?[...Lydia]A:["L","y","d","i","a"]B:["Lydia"]C:[[],"Lydia"]D:[["L","y","d","i","a"]]答案:A
string类型是可迭代的。扩展运算符将迭代的每个字符映射成一个元素。
#42期
setInterval方法的返回值是什么?setInterval(()=console.log(Hi),0)A:一个 的idB:该方法指定的毫秒数C:传递的函数D:undefined答案:A
setInterval返回一个 的id。此id可被用于clearInterval函数来取消定时。
#41期
输出是什么?!!null!!!!1A:falsetruefalseB:falsefalsetrueC:falsetruetrueD:truetruefalse答案:B
null是falsy。!null的值是true。!true的值是false。
""是falsy。!""的值是true。!true的值是false。
1是truthy。!1的值是false。!false的值是true。
#40期
输出是什么?[[0,1],[2,3]].reduce((acc,cur)={returnacc.concat(cur)},[1,2])A:[0,1,2,3,1,2]B:[6,1,2]C:[1,2,0,1,2,3]D:[1,2,6]答案:C
[1,2]是初始值。初始值将会作为首次调用时 个参数acc的值。在 次执行时,acc的值是[1,2],cur的值是[0,1]。合并它们,结果为[1,2,0,1]。第二次执行,acc的值是[1,2,0,1],cur的值是[2,3]。合并它们,最终结果为[1,2,0,1,2,3]
#39期
JavaScript中的一切都是?A:基本类型与对象B:函数与对象C:只有对象D:数字与对象答案:AJavaScript只有基本类型和对象。
基本类型包括boolean,null,undefined,bigint,number,string,symbol。
#38期
输出是什么?(()={letx,ytry{thrownewError()}catch(x){(x=1),(y=2)console.log(x)}console.log(x)console.log(y)})()A:1undefined2B:undefinedundefinedundefinedC:D:1undefinedundefined
答案:A
catch代码块接收参数x。当我们传递参数时,这与之前定义的变量x不同。这个x是属于catch块级作用域的。
然后,我们将块级作用域中的变量赋值为1,同时也设置了变量y的值。现在,我们打印块级作用域中的变量x,值为1。
catch块之外的变量x的值仍为undefined,y的值为2。当我们在catch块之外执行console.log(x)时,返回undefined,y返回2。
#37期
输出是什么?constnumbers=[1,2,3]numbers[10]=11console.log(numbers)A:[1,2,3,7xnull,11]B:[1,2,3,11]C:[1,2,3,7xempty,11]D:SyntaxError答案:C
当你为数组设置超过数组长度的值的时候,JavaScript会创建名为"emptyslots"的东西。它们的值实际上是undefined。你会看到以下场景:
[1,2,3,7xempty,11]
这取决于你的运行环境(每个浏览器,以及node环境,都有可能不同)
#36期
输出是什么?console.log(typeoftypeof1)A:"number"B:"string"C:"object"D:"undefined"答案:B
typeof1返回"number"。typeof"number"返回"string"。
#35期
下面哪些值是falsy?0newNumber(0)()()newBoolean(false)undefinedA:0,,undefinedB:0,newNumber(0),,newBoolean(false),undefinedC:0,,newBoolean(false),undefinedD:Allofthemarefalsy答案:A
只有6种falsy值:
undefinednullNaN0(emptystring)falseFunction构造函数,比如newNumber和newBoolean,是truthy。
#34期
输出是什么?functionsayHi(){return(()=0)()}typeofsayHi()A:"object"B:"number"C:"function"D:"undefined"答案:B
sayHi方法返回的是立即执行函数(IIFE)的返回值.此立即执行函数的返回值是0,类型是number
参考:只有7种内置类型:null,undefined,boolean,number,string,object,symbol和bigint。function不是一种类型,函数是对象,它的类型是object。
#33期
输出是什么?constperson={name:Lydia}functionsayHi(age){console.log(`{this.name}is{age}`)}sayHi.call(person,21)sayHi.bind(person,21)A:undefinedis21Lydiais21B:functionfunctionC:Lydiais21Lydiais21D:Lydiais21function答案:D
使用这两种方法,我们都可以传递我们希望this关键字引用的对象。但是,.call是立即执行的。
.bind返回函数的副本,但带有绑定上下文!它不是立即执行的。
#32期
当您单击该段落时,日志输出是什么?divonclick="console.log(div)"ponclick="console.log(p)"Clickhere!/p/divA:pdivB:divpC:pD:div答案:A
如果我们点击p,我们会看到两个日志:p和div。在事件传播期间,有三个阶段:捕获、目标和冒泡。默认情况下,事件处理程序在冒泡阶段执行(除非将useCapture设置为true)。它从嵌套最深的元素向外传播。
#31期
当点击按钮时,event.target是什么?divonclick="console.log(firstdiv)"divonclick="console.log(seconddiv)"buttononclick="console.log(button)"Click!/button/div/divA:OuterdivB:InnerdivC:buttonD:一个包含所有嵌套元素的数组。答案:C
导致事件的最深嵌套的元素是事件的target。你可以通过event.stopPropagation来停止冒泡。
#30期
输出是什么?constfoo=()=console.log(First)constbar=()=setTimeout(()=console.log(Second))constbaz=()=console.log(Third)bar()foo()baz()A:FirstSecondThirdB:FirstThirdSecondC:SecondFirstThirdD:SecondThirdFirst答案:B
我们有一个setTimeout函数,并首先调用它。然而,它是 打印日志的。
这是因为在浏览器中,我们不仅有运行时引擎,还有一个叫做WebAPI的东西。WebAPI提供了setTimeout函数,也包含其他的,例如DOM。
将callback推送到WebAPI后,setTimeout函数本身(但不是回调!)将从栈中弹出。
现在,foo被调用,打印"First"。
foo从栈中弹出,baz被调用.打印"Third"。
WebAPI不能随时向栈内添加内容。相反,它将回调函数推到名为queue的地方。
这就是事件循环开始工作的地方。一个事件循环查看栈和任务队列。如果栈是空的,它接受队列上的 个元素并将其推入栈。
bar被调用,打印"Second",然后它被栈弹出。
#29期
输出是什么?consta={}constb={key:b}constc={key:c}a[b]=a[c]=console.log(a[b])A:B:C:undefinedD:ReferenceError答案:B
对象的键被自动转换为字符串。我们试图将一个对象b设置为对象a的键,且相应的值为。
然而,当字符串化一个对象时,它会变成"[objectObject]"。因此这里说的是,a["[objectObject]"]=。然后,我们再一次做了同样的事情,c是另外一个对象,这里也有隐式字符串化,于是,a["[objectObject]"]=。
然后,我们打印a[b],也就是a["[objectObject]"]。之前刚设置为,因此返回的是。
#28期
输出是什么?String.prototype.giveLydiaPizza=()={returnJustgiveLydiapizzaalready!}constname=Lydianame.giveLydiaPizza()A:"JustgiveLydiapizzaalready!"B:TypeError:notafunctionC:SyntaxErrorD:undefined答案:A
String是内置的构造函数,我们可以向它添加属性。我只是在它的原型中添加了一个方法。基本类型字符串被自动转换为字符串对象,由字符串原型函数生成。因此,所有string(string对象)都可以访问该方法!
#27期
输出是什么?for(leti=1;i5;i++){if(i===3)continueconsole.log(i)}A:12B:C:D:答案:C
如果某个条件返回true,则continue语句跳过本次迭代。
#26期
JavaScript全局执行上下文为你做了两件事:全局对象和this关键字。
A:对B:错C:看情况答案:A基本执行上下文是全局执行上下文:它是代码中随处可访问的内容。
#25期
输出是什么?constobj={a:one,b:two,a:three}console.log(obj)A:{a:"one",b:"two"}B:{b:"two",a:"three"}C:{a:"three",b:"two"}D:SyntaxError答案:C
如果你有两个名称相同的键,则键会被替换掉。它仍然位于 个键出现的位置,但是值是 出现那个键的值。
#24期
输出是什么?constobj={1:a,2:b,3:c}constset=newSet([1,2,3,4,5])obj.hasOwnProperty(1)obj.hasOwnProperty(1)set.has(1)set.has(1)A:falsetruefalsetrueB:falsetruetruetrueC:truetruefalsetrueD:truetruetruetrue答案:C
所有对象的键(不包括Symbol)在底层都是字符串,即使你自己没有将其作为字符串输入。这就是为什么obj.hasOwnProperty(1)也返回true。
对于集合,它不是这样工作的。在我们的集合中没有1:set.has(1)返回false。它有数字类型为1,set.has(1)返回true。
#23期
输出是什么?varnum=8varnum=10console.log(num)A:8B:10C:SyntaxErrorD:ReferenceError答案:B
使用var关键字,你可以用相同的名称声明多个变量。然后变量将保存 的值。
你不能使用let或const来实现这一点,因为它们是块作用域的。
#22期
cool_secret可访问多长时间?sessionStorage.setItem(cool_secret,)A:永远,数据不会丢失。B:当用户关掉标签页时。C:当用户关掉整个浏览器,而不只是关掉标签页。D:当用户关闭电脑时。答案:B
关闭tab标签页后,sessionStorage存储的数据才会删除。
如果使用localStorage,那么数据将永远在那里,除非调用了localStorage.clear()。
#21期
输出是什么?constsum=eval(10*10+5)A:B:""C:TypeErrorD:"10*10+5"答案:A
代码以字符串形式传递进来,eval对其求值。如果它是一个表达式,就像本例中那样,它对表达式求值。表达式是10*10+5。这将返回数字。
#20期
输出是什么?functiongetAge(){usestrictage=21console.log(age)}getAge()A:21B:undefinedC:ReferenceErrorD:TypeError答案:C
使用"usestrict",你可以确保不会意外地声明全局变量。我们从来没有声明变量age,因为我们使用"usestrict",它将抛出一个引用错误。如果我们不使用"usestrict",它就会工作,因为属性age会被添加到全局对象中了。
#19期
输出是什么?functiongetAge(...args){console.log(typeofargs)}getAge(21)A:"number"B:"array"C:"object"D:"NaN"答案:C
扩展运算符(...args)会返回实参组成的数组。而数组是对象,因此typeofargs返回"object"。
#18期
输出是什么?functioncheckAge(data){if(data==={age:18}){console.log(Youareanadult!)}elseif(data=={age:18}){console.log(Youarestillanadult.)}else{console.log(`Hmm..YoudonthaveanageIguess`)}}checkAge({age:18})A:Youareanadult!B:Youarestillanadult.C:Hmm..YoudonthaveanageIguess答案:C
在测试相等性时,基本类型通过它们的值(value)进行比较,而对象通过它们的引用(reference)进行比较。JavaScript检查对象是否具有对内存中相同位置的引用。
题目中我们正在比较的两个对象不是同一个引用:作为参数传递的对象引用的内存位置,与用于判断相等的对象所引用的内存位置并不同。
这也是{age:18}==={age:18}和{age:18}=={age:18}都返回false的原因。
#17期
输出是什么?functiongetPersonInfo(one,two,three){console.log(one)console.log(two)console.log(three)}constperson=Lydiaconstage=21getPersonInfo`{person}is{age}yearsold`A:"Lydia"21["","is","yearsold"]B:["","is","yearsold"]"Lydia"21C:"Lydia"["","is","yearsold"]21答案:B
如果使用标记模板字面量, 个参数的值总是包含字符串的数组。其余的参数获取的是传递的表达式的值!
#16期
答案:C一元后自增运算符++:
返回值(返回0)值自增(number现在是1)一元前自增运算符++:
值自增(number现在是2)返回值(返回2)结果是.
#15期
输出是什么?functionsum(a,b){returna+b}sum(1,2)A:NaNB:TypeErrorC:"12"D:3答案:C
JavaScript是一种动态类型语言:我们不指定某些变量的类型。值可以在你不知道的情况下自动转换成另一种类型,这种类型称为隐式类型转换(implicittypecoercion)。Coercion是指将一种类型转换为另一种类型。
在本例中,JavaScript将数字1转换为字符串,以便函数有意义并返回一个值。在数字类型(1)和字符串类型(2)相加时,该数字被视为字符串。我们可以连接字符串,比如"Hello"+"World",这里发生的是"1"+"2",它返回"12"。
#14期
所有对象都有原型。A:对B:错答案:B除了基本对象(baseobject),所有对象都有原型。基本对象可以访问一些方法和属性,比如.toString。这就是为什么你可以使用内置的JavaScript方法!所有这些方法在原型上都是可用的。虽然JavaScript不能直接在对象上找到这些方法,但JavaScript会沿着原型链找到它们,以便于你使用。
#13期
事件传播的三个阶段是什么?A:TargetCapturingBubblingB:BubblingTargetCapturingC:TargetBubblingCapturingD:CapturingTargetBubbling答案:D在捕获(capturing)阶段中,事件从祖先元素向下传播到目标元素。当事件达到目标(target)元素后,冒泡(bubbling)才开始。
#12期
输出是什么?functionPerson(firstName,lastName){this.firstName=firstNamethis.lastName=lastName}constlydia=newPerson(Lydia,Hallie)constsarah=Person(Sarah,Smith)console.log(lydia)console.log(sarah)A:Person{firstName:"Lydia",lastName:"Hallie"}andundefinedB:Person{firstName:"Lydia",lastName:"Hallie"}andPerson{firstName:"Sarah",lastName:"Smith"}C:Person{firstName:"Lydia",lastName:"Hallie"}and{}D:Person{firstName:"Lydia",lastName:"Hallie"}andReferenceError答案:A
对于sarah,我们没有使用new关键字。当使用new时,this引用我们创建的空对象。当未使用new时,this引用的是全局对象(globalobject)。
我们说this.firstName等于"Sarah",并且this.lastName等于"Smith"。实际上我们做的是,定义了global.firstName=Sarah和global.lastName=Smith。而sarah本身是undefined。
#11期
输出是什么?functionPerson(firstName,lastName){this.firstName=firstName;this.lastName=lastName;}constmember=newPerson("Lydia","Hallie");Person.getFullName=function(){return`{this.firstName}{this.lastName}`;}console.log(member.getFullName());A:TypeErrorB:SyntaxErrorC:LydiaHallieD:undefinedundefined答案:A
你不能像常规对象那样,给构造函数添加属性。如果你想一次性给所有实例添加特性,你应该使用原型。因此本例中,使用如下方式:
Person.prototype.getFullName=function(){return`{this.firstName}{this.lastName}`;}
这才会使member.getFullName()起作用。为什么这么做有益的?假设我们将这个方法添加到构造函数本身里。也许不是每个Person实例都需要这个方法。这将浪费大量内存空间,因为它们仍然具有该属性,这将占用每个实例的内存空间。相反,如果我们只将它添加到原型中,那么它只存在于内存中的一个位置,但是所有实例都可以访问它!
#10期
当我们这么做时,会发生什么?functionbark(){console.log(Woof!)}bark.animal=dogA:正常运行!B:SyntaxError.你不能通过这种方式给函数增加属性。C:undefinedD:ReferenceError答案:A
这在JavaScript中是可以的,因为函数是对象!(除了基本类型之外其他都是对象)
函数是一个特殊的对象。你写的这个代码其实不是一个实际的函数。函数是一个拥有属性的对象,并且属性也可被调用。
#09期
输出是什么?letgreetinggreetign={}//Typo!console.log(greetign)A:{}B:ReferenceError:greetignisnotdefinedC:undefined答案:A
代码打印出了一个对象,这是因为我们在全局对象上创建了一个空对象!当我们将greeting写错成greetign时,JS解释器实际在上浏览器中将它视为global.greetign={}(或者window.greetign={})。
为了避免这个问题,我们可以使用`"usestrict"。这能确保当你声明变量时必须赋值。
#08期
输出是什么?classChameleon{staticcolorChange(newColor){this.newColor=newColorreturnthis.newColor}constructor({newColor=green}={}){this.newColor=newColor}}constfreddie=newChameleon({newColor:purple})freddie.colorChange(orange)A:orangeB:purpleC:greenD:TypeError答案:D
colorChange是一个静态方法。静态方法被设计为只能被创建它们的构造器使用(也就是Chameleon),并且不能传递给实例。因为freddie是一个实例,静态方法不能被实例使用,因此抛出了TypeError错误。
#07期
输出是什么?leta=3letb=newNumber(3)letc=3console.log(a==b)console.log(a===b)console.log(b===c)A:truefalsetrueB:falsefalsetrueC:truefalsefalseD:falsetruetrue答案:C
newNumber()是一个内建的函数构造器。虽然它看着像是一个number,但它实际上并不是一个真实的number:它有一堆额外的功能并且它是一个对象。
当我们使用==操作符时,它只会检查两者是否拥有相同的值。因为它们的值都是3,因此返回true。
然后,当我们使用===操作符时,两者的值以及类型都应该是相同的。newNumber()是一个对象而不是number,因此返回false。
#06期
输出是什么?letc={greeting:Hey!}letdd=cc.greeting=Helloconsole.log(d.greeting)A:HelloB:undefinedC:ReferenceErrorD:TypeError答案:A
在JavaScript中,当设置两个对象彼此相等时,它们会通过引用进行交互。
首先,变量c的值是一个对象。接下来,我们给d分配了一个和c对象相同的引用。
因此当我们改变其中一个对象时,其实是改变了所有的对象。
#05期
哪一个是正确的?constbird={size:small}constmouse={name:Mickey,small:true}A:mouse.bird.size是无效的B:mouse[bird.size]是无效的C:mouse[bird["size"]]是无效的D:以上三个选项都是有效的答案:A
在JavaScript中,所有对象的keys都是字符串(除非对象是Symbol)。尽管我们可能不会定义它们为字符串,但它们在底层总会被转换为字符串。
当我们使用括号语法时([]),JavaScript会解释(或者unboxes)语句。它首先看到 个开始括号[并继续前进直到找到结束括号]。只有这样,它才会计算语句的值。
mouse[bird.size]:首先计算bird.size,这会得到small。mouse["small"]返回true。
然后使用点语法的话,上面这一切都不会发生。mouse没有bird这个key,这也就意味着mouse.bird是undefined。然后当我们使用点语法mouse.bird.size时,因为mouse.bird是undefined,这也就变成了undefined.size。这个行为是无效的,并且会抛出一个错误类似Cannotreadproperty"size"ofundefined。
#04期
输出是什么?+true;!"Lydia";A:1andfalseB:falseandNaNC:falseandfalse
答案:A
一元操作符加号尝试将bool转为number。true转换为number的话为1,false为0。
字符串Lydia是一个真值,真值取反那么就返回false。
#03期
输出是什么?constshape={radius:10,diameter(){returnthis.radius*2},perimeter:()=2*Math.PI*this.radius}shape.diameter()shape.perimeter()A:20and62.86B:20andNaNC:20and63D:NaNand63答案:B
注意diameter的值是一个常规函数,但是perimeter的值是一个箭头函数。
对于箭头函数,this关键字指向的是它当前周围作用域(简单来说是包含箭头函数的常规函数,如果没有常规函数的话就是全局对象),这个行为和常规函数不同。这意味着当我们调用perimeter时,this不是指向shape对象,而是它的周围作用域(在例子中是window)。
在window中没有radius这个属性,因此返回undefined。
#02期
输出是什么?for(vari=0;i3;i++){setTimeout(()=console.log(i),1)}for(leti=0;i3;i++){setTimeout(()=console.log(i),1)}A:和B:和C:和答案:C
由于JavaScript的事件循环,setTimeout回调会在遍历结束后才执行。因为在 个遍历中遍历i是通过var关键字声明的,所以这个值是全局作用域下的。在遍历过程中,我们通过一元操作符++来每次递增i的值。当setTimeout回调执行的时候,i的值等于3。
在第二个遍历中,遍历i是通过let关键字声明的:通过let和const关键字声明的变量是拥有块级作用域(指的是任何在{}中的内容)。在每次的遍历过程中,i都有一个新值,并且每个值都在循环内的作用域中。
#01期
输出是什么?functionsayHi(){console.log(name)console.log(age)varname=Lydialetage=21}sayHi()A:Lydia和undefinedB:Lydia和ReferenceErrorC:ReferenceError和21D:undefined和ReferenceError答案:D
在函数内部,我们首先通过var关键字声明了name变量。这意味着变量被提升了(内存空间在创建阶段就被设置好了),直到程序运行到定义变量位置之前默认值都是undefined。因为当我们打印name变量时还没有执行到定义变量的位置,因此变量的值保持为undefined。
通过let和const关键字声明的变量也会提升,但是和var不同,它们不会被初始化。在我们声明(初始化)之前是不能访问它们的。这个行为被称之为暂时性死区。当我们试图在声明之前访问它们时,JavaScript将会抛出一个ReferenceError错误。
(不是转载请注明:http://www.balesitana.com/btqz/7036.html