如何跟踪传入函数的变量值?JS变量传递身份新手问询
通俗易懂版解答:变量跟踪、身份识别,还有你的代码问题
咱先从你最急着解决的代码问题入手,再慢慢讲变量跟踪和身份的事儿~
一、让dog变成1的正确姿势
你原来的代码为啥不管用?核心原因是:JavaScript里的基本类型(数字、字符串、布尔这些)是「按值传递」的。
简单说就是:你把
dog(值是0)传给函数dogStuff的animal参数时,相当于给animal复制了一份0,函数里改animal的话,只会改这份复制的副本,和外面的dog半毛钱关系都没有。而且你写的animal = animal++还有个小坑:animal++是先返回当前值(0),再把animal变成1,所以这行代码其实等于animal = 0,白忙活了😂
给你两种简单的解决方法:
方法1:让函数返回新值,外面重新赋值
这是最常用的方式,逻辑清晰,新手也好理解:
var dog = 0; function dogStuff(animal) { // 直接返回自增后的值,用++animal也可以(先自增再返回) return animal + 1; } // 把函数返回的新值重新赋值给dog dog = dogStuff(dog); console.log(dog); // 输出1,搞定!
方法2:用对象包裹(针对一定要函数内部修改外部变量的场景)
如果非得让函数内部直接改外面的变量,可以把dog放进对象里——因为对象是「按引用传递」的,传参时传的是对象的引用,函数里改对象的属性会直接影响外面的对象:
var dogObj = { value: 0 }; function dogStuff(animal) { // 直接修改对象的属性,外面的dogObj也会跟着变 animal.value++; } dogStuff(dogObj); console.log(dogObj.value); // 输出1
二、怎么跟踪传入函数的变量的值?
这个超简单,分两种场景:
- 临时查看单次传入的值:在函数开头加个
console.log就行,一眼就能看到传入的是什么:
function dogStuff(animal) { // 打印传入的变量值 console.log('这次传入的animal值是:', animal); return animal + 1; }
- 记录多次调用的变化:如果要跟踪每次调用的传入值,可以在函数外面定义一个数组,每次调用时把值存进去:
// 用来存每次传入的值的日志数组 var valueLog = []; var dog = 0; function dogStuff(animal) { valueLog.push(animal); // 把当前传入的值存到日志里 return animal + 1; } dog = dogStuff(dog); // 第一次传入0 dog = dogStuff(dog); // 第二次传入1 console.log(valueLog); // 输出 [0, 1],清晰看到每次的传入值
三、JavaScript能跟踪传入函数的变量身份吗?
这里要先明确:变量的「身份」分两种情况:
1. 基本类型(数字、字符串等):没有"专属身份"
基本类型的值是不可变的,传参时是复制值,所以JS没法区分两个值相同的基本类型是不是来自同一个变量。比如你传dog(值0)和直接传0,函数里拿到的都是0,完全一样,没法判断是不是同一个变量传进来的。
2. 引用类型(对象、数组、函数等):可以跟踪身份
引用类型存在内存里,传参时传的是内存地址的引用——也就是说,函数里的参数和外面的变量指向同一个对象。这时候可以用===来判断是不是同一个对象(也就是同一个"身份"):
var myDog = { name: "旺财" }; function checkAnimal(animal) { // 用===判断是不是同一个对象 if (animal === myDog) { console.log("这是我家旺财!"); } else { console.log("这是别人家的狗😯"); } } checkAnimal(myDog); // 输出"这是我家旺财!" checkAnimal({ name: "旺财" }); // 输出"这是别人家的狗😯"(因为是新对象,引用不同)
如果想给对象加个唯一标识方便跟踪,还可以手动给对象加个ID:
var myDog = { name: "旺财", id: 10086 }; function trackAnimal(animal) { if (animal.id === 10086) { console.log("找到我的专属旺财了!"); } } trackAnimal(myDog); // 输出"找到我的专属旺财了!"
内容的提问来源于stack exchange,提问作者Christoph
相关产品推荐
相关产品推荐

